2015-09-06 1 views
0

У меня есть два массива для моей веб-страницы - первый список всех доступных элементов, а второй - отфильтрованный список, заполненный конкретными элементами из первого списка. Второй список заполняется, щелкнув элемент и вызвать функцию перебрать ищем конкретные данные:Как «синхронизировать» два массива с использованием выбитого нокаута?

self.populate = function() { 
    self.visibleEmails([]); 
    for (var i = 0; i < self.emails().length; i++) { 
     if (self.emails()[i].folder() == this.name) { 
      self.visibleEmails.push(self.emails()[i]); 
     } 
    } 
} 

Это прекрасно работает, однако если изменить главный массив всех элементов, я должен нажать снова заселить второй массив, так как он не знает, что какие-либо изменения были сделаны. Я читал о вычисленных наблюдаемых, которые могли обновить наблюдаемые, если бы изменения были внесены в зависимость, поэтому мне было интересно, возможно ли это в этом случае?

Для полного взгляда на моем приложении вы можете проверить его здесь:

http://jsfiddle.net/s0dhzd2t/55/

Если вы посмотрите на пример, вы можете увидеть, что я имею в виду, если вы пытаетесь удалить или переместить элемент (s). Это технически работает, но вам нужно снова щелкнуть папку слева, чтобы увидеть изменения!

ответ

1

computed что ко все и вот, как вы бы использовать один для этого:

self.visibleEmails = ko.computed(function() { 
    return self.emails().filter(function(e) { 
     return e.folder() == self.selectedFolder().name; 
    }); 
}); 

Потому что он вызывает emails() будет пересматриваться каждый раз, когда emails изменения.

Примите этот стиль для все и вы получите много преимуществ.

http://jsfiddle.net/s0dhzd2t/57/

+0

Итак, я кладу это в моем .populate наблюдаемым? Извините за мое высокомерие, но я довольно новичок в нокауте, и я хочу убедиться, что я делаю это правильно. Любой шанс, который вы могли бы показать мне в моем jsFiddle, чтобы я мог точно видеть, как он должен выглядеть? –

+0

В принципе, вы сделали бы это [как это] (http://jsfiddle.net/kevinvanlierde/s0dhzd2t/56/), путем (1) добавления наблюдаемого 'selectedFolder' (обладающего свойством name), (2) переноса вашего фильтра логику внутри 'visibleEmails', вычисленный наблюдаемый и (3) изменение функции' populate', чтобы просто обновить 'selectedFolder' – Tyblitz

+0

Большое вам спасибо, это имеет смысл сделать так! –

Смежные вопросы