Javascript 如何获取模型的实例';把手模板中的控制器?

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}

我一直遇到一个棘手的情况:在把手模板中需要一个新的控制器实例

以下是我的情况的一个简单例子。(请原谅我使用了CoffeeScript)

在Ember,我有一个模型:

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>