Как мне обновить индикаторы после того, как элемент был удален? - PullRequest
1 голос
/ 30 января 2011

Я работаю над модулем contacts моего расширения Google Chrome.Пользователь может добавлять и удалять контакты.Все делается с помощью JavaScript и jQuery.

Этот вопрос больше относится к логике, поэтому не стоит расстраиваться из-за кода.

Это способ добавления контакта.:

function addContact(name){
 var n = incContactNum();
 chrome.extension.getBackgroundPage().setItem('contact'+n+'', name); 
 contacts[n] = name;
}

Общее число контактов должно быть увеличено, поэтому теперь у нас есть n контакты.Кроме того, мы обновляем массив контактов.

Таким образом, таблица элементов SQLite выглядит следующим образом:

 ------------------------
|  key          value    |
 ------------------------
| contactNum     3       |
 ------------------------
| contact1       Test1   |
 ------------------------
| contact2       Test2   |
 ------------------------
| contact3       Test3   |
 ------------------------

При удалении строки, например, строки 2, таблица выглядит так:

 ------------------------
|  key          value    |
 ------------------------
| contactNum     2       |
 ------------------------
| contact1       Test1   |
 ------------------------
| contact3       Test3   |
 ------------------------

Как видите, contactNum уменьшается.Теперь у нас есть два элемента, но второй имеет 3 в качестве индекса, но его следует изменить с contact3 на contact2.Вы можете понять проблему, когда увидите мою функцию удаления:

function removeContact(value){
 contacts = new Array(getValue("contactNum"));
 for(i = 1; i <= parseInt(getValue("contactNum")); i++){
  if(getValue("contact"+i) == value){
   chrome.extension.getBackgroundPage().deleteItem("contact"+i);
   decContactNum();
   break;
  }
 }
}

Элемент удален по значению.Поэтому я ищу соответствующий индекс для удаления строки.Поскольку число контактов теперь равно 2, индекс 3 никогда не достигается.

Моя идея: первое удаление работает, поэтому после этого необходимо перестроить индексы.От того, что было удалено, уменьшаются все индексы.

Есть идеи, как это сделать?

1 Ответ

1 голос
/ 30 января 2011

У вас есть два варианта.Первый вариант - это то, что я упомянул в комментарии под вашим вопросом.

  • Измените код на фоновой странице, чтобы уменьшить значение каждой клавиши, следующей за той, которая должна быть удалена.

function removeContact(value){
    var len = getValue("contactNum");
    var found = 0;
    for(i = 1; i < len; i++){
        if(found==0 && getValue("contact"+i) == value){
            found=1;
        }
        if (found==1){
            chrome.extension.getBackgroundPage().setItem("contact"+i,getValue("contact"+(i+1)));
        }
     }
     decContactNum();
     chrome.extension.getBackgroundPage().deleteItem("contact"+len);
}
  • Этот метод подходит, только если порядок не имеет большого значения.Поменяйте местами удаляемую запись (часть данных) с последней записью, а затем удалите последнюю запись, как вы делали в опубликованном коде.

function removeContact(value){
    var len = getValue("contactNum");
    for(i = 1; i <= len; i++){
        if(getValue("contact"+i) == value){
            chrome.extension.getBackgroundPage().setItem("contact"+i,getValue("contact"+len));
            break;
        }
     }
     decContactNum();
     chrome.extension.getBackgroundPage().deleteItem("contact"+len);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...