Javascript 如何获取模型的实例';把手模板中的控制器?
我一直遇到一个棘手的情况:在把手模板中需要一个新的控制器实例 以下是我的情况的一个简单例子。(请原谅我使用了CoffeeScript) 在Ember,我有一个模型:Javascript 如何获取模型的实例';把手模板中的控制器?,javascript,ember.js,handlebars.js,ember-data,Javascript,Ember.js,Handlebars.js,Ember Data,我一直遇到一个棘手的情况:在把手模板中需要一个新的控制器实例 以下是我的情况的一个简单例子。(请原谅我使用了CoffeeScript) 在Ember,我有一个模型: App.Foo = DS.Model.extend attr: DS.attr() ... 我从一个端点等加载它。。并放入阵列控制器中: App.FooArray = Ember.ArrayController.extend ###* * Array of App.Foo * @type {Array}
App.Foo = DS.Model.extend
attr: DS.attr()
...
我从一个端点等加载它。。并放入阵列控制器中:
App.FooArray = Ember.ArrayController.extend
###*
* Array of App.Foo
* @type {Array}
*/
content:
method: ->
...
{{action 'action' target=**********}}
最后,我有一个用于此模型的“实例”控制器,它实现了更多的方法(即,这不是路由器级别的单例控制器,而是一个装饰器(或代理),它通过添加的方法和事件处理程序来增强模型):
在Handlebar中,我想迭代App.FooArray
中的项目:
{{#each myFooArray}}
Hi! My attr is {{attr}}
{{/each}}
等等。。这在参数等方面非常有效
但是,当我想使用操作(或属于FooController的其他属性)时,问题就开始了
嗯,我想要的控制器是App.FooController
的一个实例。
到目前为止,我一直在实例化模型中的控制器(糟糕!)
因此,迭代如下:
{{#each myFooArray}}
Hi! My attr is {{attr}} <a {{action 'action' target=myController}}>Action me!</a>
{{/each}}
{{#每个myFooArray}
你好我的属性是{{attr}}动作我!
{{/每个}}
我知道这很糟糕,但我想不出更好的办法。谁来帮我看看灯 您可以在
每个
循环中显式设置itemController
{{#each myFooArray itemController="foo"}}
Hi! My attr is {{attr}}
{{/each}}
这个问题提出了一个关于ArrayController、CollectionView、Models和ObjectController的重要且长期存在的问题 在写这篇文章的时候,我对余烬内部运作的了解是有限的。不过,我可以将我的问题更简洁地表述如下:
{{#each myFooArray}}
Hi! My attr is {{attr}} <a {{action 'action' target=myController}}>Action me!</a>
{{/each}}
给定模型的ArrayController、CollectionView和实例控制器,如何利用ArrayController的itemControllerClass
属性迭代其内容并将每个项包装在itemController
的唯一(即非单例)实例中?
事实证明,这个问题由来已久,解决方案与杰里米·格林(jeremy green)遥相呼应,但我将在此详述
但首先:封装问题的Ember支持线程:
我认为那里的讨论非常清楚地指出在某些情况下需要非单例控制器
此外,以下是ArrayController的文档,其中指出ArrayController上存在“itemController”属性:
进一步查看文档,您还将注意到“lookupItemController”功能的存在:
这些函数的明确目的是以控制器数组的形式返回内容,但是如何返回呢
第一个要求是直接使用ArrayController作为循环中的内容。不幸的是,这就是事情开始分崩离析的地方
您可能会认为可以使用CollectionView
:
{{view myCollectionView controllerBinding=myArrayController}}
或
但不幸的是,情况并非如此。在渲染另一个控制器路由上的控制器的情况下更是如此。CollectionView不保留ArrayController与其“itemControllerClass”之间的关系`
正如@jeremy green所指出的,实现这一目标的唯一途径是:
{{#each myFooArray itemController="foo"}}
Hi! My attr is {{attr}}
{{/each}}
一个更完整的例子是:
<ol class="foo-item-list">
{{#each controllers.foo_items}}
<li>{{ view "foo" }}</li>
{{/each}}
</ol>
{{{each controllers.foo_items}
{{查看“foo”}
{{/每个}}
其中,App.FooItemsController
定义了属性itemController
或lookupItemController
不幸的是,在这种情况下,我们失去了使用CollectionView的
标记名
或清空视图
属性的好处。希望如果有一个“ArrayView”被创建,它将为这种情况带来两全其美 我认为使用Ember.ObjectProxy
不是一个好主意。您使用ObjectProxy只是为了没有单例控制器吗?某些模型需要每个实例都有一个控制器(例如新闻提要中的项目?),控制器将包含与对象相关的某些属性,这些属性可能不一定需要持久化到存储中。是否可以为多个单独的模型项使用一个控制器?模型是状态保持的地方。而控制器只提供了额外的方法,如userIsAdmin
等。因此,最好不要在控制器中存储数据。ObjectController是一个包装模型的控制器,因此在模板中,当您引用类似{{input type=“text”value=name}的内容时,它将首先搜索控制器中的name属性,如果找不到,它将委托给模型。我认为使用Ember.ObjectController是一个好主意。是的,你是对的,我已将我的问题改为使用ObjectController。即使如此,仍然存在一个问题:如何在#each helper中获取控制器?这非常好。itemController的绑定有点棘手,但arrayController确实具有itemController属性,该属性将传递给每个帮助程序。
{{view myCollectionView contentBinding=myArrayController}}
{{#each myFooArray itemController="foo"}}
Hi! My attr is {{attr}}
{{/each}}
<ol class="foo-item-list">
{{#each controllers.foo_items}}
<li>{{ view "foo" }}</li>
{{/each}}
</ol>