{{#each objects}}与{{#each model.objects}} vs. {{#each content.objects}}

时间:2014-04-20 06:50:41

标签: javascript ember.js

我写了一个非常简单的路线,用一个子集合作为模型导出一个对象:

App.IndexRoute = Ember.Route.extend({
    model: function() {
        return Ember.Object.create({
            objects: [...]
        });
    }
});

现在在我的模板中,我尝试迭代这些对象:

{{#each objects}}
    ...
{{/each}}

出于某种原因,这可以在官方的ember jsfiddle中使用,但是当我在本地运行相同的代码时,我必须将其更改为{{#each content.objects}}以使其正常工作。我在我的案例和jsfiddle之间发现的唯一区别是:

  1. 我使用browserify + hbsify编译模板,并没有使用内联手柄模板
  2. 我没有定义应用程序模板,而jsfiddle则这样做。
  3. 我错过了什么?

1 个答案:

答案 0 :(得分:1)

我可以解释3之间的差异,希望这样可以解决一些问题。

  • {{#each objects}} - 这来自控制器上的objects属性。如果您已明确定义名为objects的属性,则会使用该属性。但是如果您没有明确定义一个,我认为是这种情况,控制器(从ObjectProxy扩展)将代理请求到content属性。

    因此,首先Ember会调用controller.get('objects'),因为您没有定义undefined属性,所以会返回objects。从那里,将调用unknownProperty函数,它将返回content.objects的内容。

    使用此表单的底线将根据您的控制器的声明方式而有所不同。如果可能的话尽量避免使用这个。

  • {{#each model.objects}} - model实际上是content的别名,但从技术上讲,您不应该知道这一点。 content属性仅仅是Ember对象代理如何工作的实现细节。

    最后,只知道model拥有您当前的模型,您应该更喜欢这种访问属性的方法。 (因为在我看来,它消除了歧义。)

  • {{#each content.objects}} - content是Ember对象代理的实现细节。在这种特殊情况下,content是您提供的模型。您应该避免使用此方法,因为它依赖于对象代理的属性命名为content(在技术上可以随时更改)。

因此,对于您的问题,我认为{{#each objects}}无效,因为以某种方式定义了另一个objects属性。您应该使用{{#each model.objects}}代替。 (或者,如果可以,请切换为ArrayController并使用{{#each}}