2013-03-23 2 views
0

я мог бы использовать это все неправильно, но:ember.js arraycontroller звонок с точки зрения

У меня есть ArrayController, представляющий собой набор продуктов. Каждый продукт получает визуализацию, и есть несколько действий, которые может предпринять пользователь, например, отредактировать название продукта или скопировать описание из другого продукта.

Вопрос: как вы взаимодействуете с контроллером для конкретного продукта, с которым работаете? Как контроллер узнает, какой продукт редактируется?

Я также попытался создать Ember.Select with selectionBinding, установленный на "controller.somevar", но это также не удалось.

ответ

1

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

Другое, что было бы полезно в вашем случае, состоит в том, чтобы иметь itemController для каждого продукта в списке. Таким образом, вы можете обрабатывать специфическую для элемента логику в этом контроллере элемента.

У меня недостаточно информации для понимания вашей архитектуры, поэтому я сделаю несколько предположений.

Учитывая у вас есть следующие ProductsController:

App.ProductsController = Ember.ArrayController.extend(); 

Вам нужно создать ProductController, который будет создан, чтобы обернуть каждый продукт сам по себе.

App.ProductController = Ember.ObjectController.extend(); 

Вам нужно изменить шаблон следующим образом:

{{#each controller itemController="product"}} 
    <li>name</li> 
{{/each}} 

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

Другой вариант:

Если вы будете заниматься только один продукт, в то время, вы можете использовать маршруты, чтобы описать, какой продукт вы работаете с:

App.Router.map(function() { 
    this.resource('products', { path: '/products' }, function() { 
    this.resource('product', { path: '/:product_id' }, function() { 
     this.route('edit'); 
    }); 
    }); 
}); 

И создать контроллер для редактирования продукт:

App.ProductEditController = Ember.ObjectController.extend(); 

И список ваших пунктов будет ссылка на этот продукт маршрут:

{{#each controller}} 
    <li>{{#linkTo "product.edit" this}}name{{/linkTo}}</li> 
{{/each}} 
+0

вы сэр блестящие! Первое решение работало, я не знал о itemController в каждом. Любая идея, как я получаю содержимое Ember.Select contentBinding, чтобы вытащить контент из функции, определенной на ProductController? –

+0

Я не уверен, что вы имеете в виду, Ember.Select находится внутри '{{#each}}'? Обычно вы хотели бы сделать эту функцию вычисленным свойством 'list: function() {return this.get ('categories'); } .property ('categories') ', а затем' contentBinding = 'list'' –

0

Если определить itemController на ваш ProductsController вам не нужно указать, что деталь в шаблоне:

App.ProductsController = Em.ArrayController.extend({ 
    itemController: 'product', 
    needs: ['suppliers'], 
    actions: { 
    add: function() { 
     // do something to add an item to content collection 
    } 
    } 
}); 

App.ProductController = Em.ObjectController.extend({ 
    actions: { 
    remove: function() { 
     // do something to remove the item 
    } 
    } 
}); 

Используйте шаблон коллекции, как это:

<button {{action="add"}}>Add Item</button> 
<ul> 
{{#each controller}} 
    <li>{{name}} <button {{action="remove"}}>x</button></li> 
{{/each}} 
</ul> 

документация Ember описывает itemControllerhere:

Вы также можете определить функцию lookupItemController, который может динамически определять контроллер элемента (например, на основе типа модели).

То, что я обнаружил при рендеринге коллекции, обернутой в ArrayController в рамках другого шаблона/вида, является способ использования #each. Убедитесь, что вы используете {{#each controller}}, так как Teddy Zeeny показывает, что в итоге вы используете элементы модели контента, а НЕ - элементы, обработанные элементом управления. Вы можете не заметить этого до тех пор, пока не попытаетесь использовать действия, которые предназначены для управления контроллером элемента или другим контентом на основе контента на контроллере.

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

Так что в моем шаблоне продуктов я хотел бы сделать что-то вроде этого, чтобы перечислить вложенные поставщиков (если ваш маршрут «продукт» должным образом контроллер «поставщиков»):

{{view controller=controllers.suppliers templateName="products/suppliers"}} 

Поставщики шаблона просто следует за тот же шаблон, что и шаблон, показанный выше.

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