Ember.js 从模板访问模型

Ember.js 从模板访问模型,ember.js,Ember.js,在玩ember时,我发现有时模型存储在控制器的content属性中,有时模型也可以直接在控制器上使用。然而,我不明白,在这种情况下 让我用我在组装ember MVC时发现的一个例子来解释它 设置A-开始 我定义了一个自定义的成员对象、相应的成员路由、成员视图类和一个名为成员的模板 成员对象具有一些属性,例如id,昵称,等等 注意:未定义MemberController形式的控制器,因此按照ember的约定,它自行提供控制器 设置B-自定义设置 与设置A相同,但现在定义了一个MemberCo

在玩ember时,我发现有时模型存储在控制器的
content
属性中,有时模型也可以直接在控制器上使用。然而,我不明白,在这种情况下

让我用我在组装ember MVC时发现的一个例子来解释它

设置A-开始

  • 我定义了一个自定义的
    成员
    对象、相应的
    成员路由
    成员视图
    类和一个名为
    成员
    的模板
  • 成员
    对象具有一些属性,例如
    id
    昵称
    ,等等
  • 注意:未定义
    MemberController
    形式的控制器,因此按照ember的约定,它自行提供控制器
设置B-自定义设置

  • 与设置A相同,但现在定义了一个
    MemberController
    ,其中包含一些从模板中触发的操作方法
奇怪的行为(分别是我不完全理解的)

  • 在设置A中,我可以使用
    {{id}
    {{昵称}
    直接引用
    成员的属性
  • 在设置B中,我必须使用
    {{content.id}
    {{content.昵称}
正如ember文档中所记录的那样,
MemberView

setupController : function(controller, member) {
    controller.set('content', member);
},
那么,有人能帮我理解为什么会有差异,以及差异在哪里吗?目前,我的猜测是

  • 模板的上下文不同(控制器的设置中可能缺少代码段?)

  • ember自动提供的默认控制器具有一些额外的魔力,这些魔力对于自定义控制器来说是无法直接使用的
任何有助于理解这一点的帮助都是非常感谢的。我已经花了很长时间才做到这一点。我首先认为这可能是由项目设置和requireJS引入的模块化(我仍然认为这可能会产生影响)。余烬是v1.0pre4

提前谢谢! 帕特里克

那么,有人能帮我理解为什么会有差异,以及差异在哪里吗?目前,我的猜测是 模板的上下文不同(控制器的设置中可能缺少代码段?) 或 ember自动提供的默认控制器具有一些额外的魔力,这些魔力对于自定义控制器来说是无法直接使用的

如果没有看到您的代码,很难确定,但我最好的猜测是您的
MemberController
扩展了
Ember.Controller
。ember(在此场景中)提供的默认值应该是
ember.ObjectController
。如果这是您想要的,请将MemberController定义更改为:

App.MemberController = Ember.ObjectController.extend({
  myProperty: 'value'
});
objectController充当其
内容
属性的代理,通常是余烬模型。因此,如果连接正确,您就不需要通过“content”属性访问模型。如果你曾经看到过这样的事情:

{{content.id}} or {{content.nickname}}

这是您应该更改为ObjectController的标志。看见有关更详细的说明。

一个
ObjectController
充当控制器内容对象集的代理。未定义控制器时,Ember将为您创建一个控制器,并将其内容默认设置为路由中
model()函数返回的任何对象(如果已定义)。无论您定义自己的控制器还是让Ember为您定义一个控制器,行为都应该相同

模板中的默认上下文是控制器本身,即
this=控制器的实例或生成的实例
。当您尝试在该上下文中访问昵称时,Ember将首先尝试根据控制器本身解析昵称,如果未找到任何内容,它将根据其内容解析昵称,即如果您已手动将其设置为控制器的内容,则根据对象解析昵称

最后,路由中没有默认的
model()函数实现
,除非您使用动态URL,
say/foo/id解析为/foo/:id
,Ember使用提供的id加载带有提供id的foo对象,从而为model()函数提供默认实现。最后,它归结为相同的机制,只是为了您的方便而自动进行


我建议您收听更多有关如何通过Ember为您实现自动化的见解。但是当涉及到显示的内容时,您不需要手动连接控制器的内容。

太好了,谢谢Michael。这不仅是解释,也是我代码中的错误所在。我有
App.MemberController=Ember.Controller.extend({})。至少这个错误让我们对控制器有了更好的了解。又来了!PHA已经得分了,迈克尔真的得分了。但是谢谢你的解释和有趣演讲的链接。