我可能用错了,但是:
我有一个代表产品集合的 ArrayController。每个产品都会被渲染,用户可以采取多种操作,例如编辑产品标题或复制不同产品的描述。
问题是:您如何与您正在使用的特定产品的控制器进行交互?控制器如何知道正在编辑哪个产品?
我还尝试创建一个 Ember.Select 并将 selectionBinding 设置为“controller.somevar”,但这也失败了。
我可能用错了,但是:
我有一个代表产品集合的 ArrayController。每个产品都会被渲染,用户可以采取多种操作,例如编辑产品标题或复制不同产品的描述。
问题是:您如何与您正在使用的特定产品的控制器进行交互?控制器如何知道正在编辑哪个产品?
我还尝试创建一个 Ember.Select 并将 selectionBinding 设置为“controller.somevar”,但这也失败了。
我认为您需要做的最重要的事情是首先将尽可能多的逻辑从视图中移到控制器中。
对您的情况有用的另一件事是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}}
如果您在您的模板上定义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 文档itemController
在此处描述:
您甚至可以定义一个lookupItemController
可以动态决定项目控制器的函数(例如,可能基于模型类型)。
我在渲染包含ArrayController
在另一个模板/视图中的集合时发现的事情#each
是使用方式。确保您使用{{#each controller}}
Teddy Zeeny 表演,否则您最终会使用内容模型项目,而不是项目控制器包装的项目。在您尝试使用旨在由项目控制器或其他基于控制器的内容装饰处理的操作之前,您可能不会注意到这一点。
当我需要在另一个视图中嵌套整个集合时,我使用视图助手如下正确设置上下文,以便任何集合级别的操作(例如添加项目按钮操作)由数组控制器而不是由主控制器设置处理由路线。
所以在我的产品模板中,我会做这样的事情来列出嵌套的供应商(假设你的“产品”路线有正确的“供应商”控制器):
{{view controller=controllers.suppliers templateName="products/suppliers"}}
供应商模板只是遵循与我上面显示的模板相同的模式。