2012-06-26 3 views
1

У меня есть список объектов, хранящихся в arrayController и вынесенное на представлении с помощью представления #each макроИмеет ли смысл использовать ObjectController и ArrayController вместе?

{{#each item in controller}} 
    {{view App.ItemView}} 
{{/each}} 

Каждый элемент имеет имя класса связывания, который зависит от действий пользователя. Для Exemple:

App.ItemView = Ember.View.extend { 
    classNameBindings: ['isSelected:selected'] 
} 

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

Вопрос: где я должен вычислить этот объект isSelected? В itemsController? В itemController? Непосредственно в каждом itemView?

ответ

3

Для меня это имеет смысл положить его в представление, поскольку, кроме того, это действительно проблема отображения.

У вас есть пример здесь: http://jsfiddle.net/MikeAski/r6xcA/

Рули:

<script type="text/x-handlebars" data-template-name="items"> 
    {{#each item in controller}} 
     {{view App.ItemView contentBinding="item"}} 
    {{/each}} 
</script> 

<script type="text/x-handlebars" data-template-name="item"> 
    Item: {{item.label}} 
</script> 

JavaScript:

App.ItemsController = Ember.ArrayController.extend({ 
    selected: null 
}); 

App.ItemsView = Ember.View.extend({ 
    templateName: 'items' 
}); 

App.ItemView = Ember.View.extend({ 
    templateName: 'item', 
    classNameBindings: ['isSelected:selected'], 

    isSelected: function() { 
     var item = this.get('content'), 
      selected = this.getPath('controller.selected'); 
     return item === selected; 
    }.property('item', 'controller.selected'), 

    click: function() { 
     var controller = this.get('controller'), 
      item = this.get('content'); 
     controller.set('selected', item); 
    } 
}); 

App.ItemsView.create({ 
    controller: App.ItemsController.create({ 
     content: [{ label: 'My first item' }, 
        { label: 'My second item' }, 
        { label: 'My third item' }] 
    }) 
}).append(); 
​ 
+0

Спасибо за этот пример. Еще один вопрос: я не вижу, когда объект 'controller' установлен в App.ItemView? – jrabary

+0

В образце он устанавливается при создании представления. В «реальной жизни» он будет автоматически привязан к «connectOutlet». –

+1

@jrabary Я думаю, что контроллер, о котором вы упоминаете, является неявным контроллером представлений детей. Если это так, то в этом случае он наследуется от ItemsView. –

0

Это звучит, как вам нужно две вещи - в isSelected недвижимости на самой (модель) элемент, который отвечает на вопрос «? Является ли этот пункт выбран», и selectedItem свойство на itemsController, который отвечает на вопрос, " Какой элемент выбран? " Свойство на модели - это просто get/set; вы можете вычислить itemsController.selectedItem, отфильтровав список элементов для одного, где isSelected является истинным, или вы можете явно установить его с помощью некоторого кода, чтобы отменить выбор ранее невыбранных элементов.

+1

Это была моя первая мысль, но я не хочу чтобы загромождать мою модель дополнительными свойствами, кроме тех, которые я сохраняю в своей базе данных. Следовательно, я хотел бы проксировать эти свойства itemController, полученных из Ember.ObjectController. – jrabary

+0

Я не возражаю против атрибута 'isSelected' в этом элементе, это хорошая идея, поскольку он, безусловно, не имеет ничего общего с атрибутами модели, будучи только информацией о состоянии отображения. –

+0

Из документации: «Мы начинаем с контроллеров, а не подвергаем объекты модели непосредственно вашим шаблонам, чтобы у вас было место, где можно было бы связать связанные с просмотром свойства и не загрязнять ваши модели проблемой». – pjmorse

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