Я думаю, что ваша реакция на кишку правильная - вы не должны устанавливать свойства своих моделей, которые строго связаны с вашим пользовательским интерфейсом.
Компоненты являются строительными блоками в Ember для хранения состояния слоя UI. В Ember это довольно сложное время, потому что для этой цели также используются контроллеры, но они уже на пути. Скоро будут все компоненты.
Когда я сталкиваюсь с таким случаем, как ваш (список с выбранными предметами), я обычно делаю компонент list
и компонент list-item
. list
знает, какой элемент выбран, и каждый list-item
знает, выбрано ли оно. Для вашего простого случая одно из других решений может быть более прямолинейным, но я обычно нахожусь с этими списками, вы в конечном итоге захотите больше функциональности (привязка к выбранному элементу, более сложные шаблоны и т. Д.).
Так один подход может выглядеть следующим образом:
{{#address-list selected=selectedAddress as |list|}}
{{#each address in model}}
{{#address-list-item item=address list=list}}
<p>{{address.address1}}</p>
{{/address-list-item}}
{{/each}}
{{/address-list}}
используется блок Params (примечание: Ember 1,10 и выше), чтобы передать <address-list>
в каждую <address-list-item>
.Теперь ваш адрес элемент списка может сказать список новый адрес был выбран путем направления действия на него:
App.AddressListItemComponent = Ember.Component.extend({
classNameBindings: ['active'],
active: function() {
return this.get('list.selected') === this.get('item');
}.property('list.selected', 'item'),
click: function() {
this.get('list').send('select', this.get('item'));
}
});
App.AddressListComponent = Ember.Component.extend({
actions: {
select: function(item) {
this.set('selected', item);
}
}
});
Это настраивает все привязки для вас, добавляет .active
класса к каждым <address-list-item>
, и позволяет вы привязываетесь к выбранному элементу <address-list>
вне шаблона.
See a working JSBin here.
Теперь, ориентированный на list
, как это использовать .send
неудобно, и именно поэтому в ближайшее время мы сможем передать действия вниз в дочерние компоненты (проверить Road to Ember 2.0 руководства и поиск «улучшающих действия»). После того, как эта функциональность приземлится, вы сможете передать обработчик действий select
с <address-list>
непосредственно в каждый <address-list-item>
. Но пока это один из способов, и это сделает рефакторинг довольно простым, когда эти изменения приземляются.
Я не уверен, что все контроллеры выйдут наружу, просто ObjectController и ArrayController, которые обладают способностью проксирования (get ('foo') может получить доступ к this.foo или этому. model.foo). Исправьте меня, пожалуйста, если я ошибаюсь –
не все контроллеры уходят, см. Раздел «Распределенные компоненты» [здесь] (https://github.com/emberjs/rfcs/pull/15) (и [маршрутизируемые компоненты RFC] (https://github.com/ef4/rfcs/blob/routeable-components/active/0000-routeable-components.md)) –
убедитесь, что {{yield this}} в вашем - вот что делает блок param работает –