Emberjs фильтрует обновление коллекции выбора

#javascript #ember.js

#javascript #ember.js

Вопрос:

Я создал JSBin, где я демонстрирую свою проблему:

http://jsbin.com/pexolude/69/edit

Эксплонация:

В первом разделе у меня есть клиенты. Значение этого выбора (customer_value) фильтрует коллекцию 2-го выбора (ContactPersons). Если вы выберете клиента, будет включена кнопка «Новое контактное лицо». По щелчку он добавляет новое контактное лицо «Дейл» в закусочную Double R. (В моем приложении это форма, и новое контактное лицо будет добавлено к выбранному клиенту)

Испытание

  • Выберите «Double R Diner»
  • Добавить новое контактное лицо (Дейл добавлен, но его нет в списке контактных лиц Double R Diner)
  • Смена на «Отель Грейт Нортен»
  • Вернитесь в «Double R Diner» -> Дейл есть в списке

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

Ответ №1:

В целом, хорошее эмпирическое правило состоит в том, чтобы просмотреть все свойства, которые требуются в вашем вычисляемом свойстве, и если какое-либо из них влияет на значение вычисляемого свойства (что, я полагаю, они все делают), тогда они должны быть определены в методе property .

В этом случае вам нужно будет просмотреть каждое свойство в коллекции, для этого мы используем @each ключевое слово. Важно отметить, что вы не можете углубиться более чем на один уровень @each . http://emberjs.com/guides/object-model/computed-properties-and-aggregate-data /

   contact_persons: function(){
    var id = parseInt(this.get('customer_value'),10);
    return this.get('contactPersons').filterBy('partner.id',id);
  }.property('customer_value', 'contactPersons.@each.partner'),
 

Здесь мы говорим о том, что каждый раз, когда какая-либо новая запись добавляется / удаляется в ContactPersons, или partner свойство изменяется для любого из них ( partner само по себе, нет partner.foo , partner ссылка должна измениться), тогда свойство становится грязным.

Пример: http://jsbin.com/pexolude/72/edit