我写了一个非常简单的路线,用一个子集合作为模型导出一个对象:
App.IndexRoute = Ember.Route.extend({
model: function() {
return Ember.Object.create({
objects: [...]
});
}
});
现在在我的模板中,我尝试迭代这些对象:
{{#each objects}}
...
{{/each}}
出于某种原因,这可以在官方的ember jsfiddle中使用,但是当我在本地运行相同的代码时,我必须将其更改为{{#each content.objects}}以使其正常工作。我在我的案例和jsfiddle之间发现的唯一区别是:
我错过了什么?
答案 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}}
。