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

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


现在在我的模板中,我尝试遍历对象,如下所示:

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


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


我使用browserify + hbsify来编译模板,而不使用内联把手模板
我没有定义应用程序模板,而jsfiddle却定义了。


我想念什么?

最佳答案

我可以解释一下这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}}

关于javascript - {{#each objects}}与{{#each model.objects}}与{{#each content.objects}}对比,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23179346/

10-12 22:10