从模板访问模型

时间:2013-01-23 23:30:13

标签: ember.js

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

让我通过组装我的余烬MVC时发现的一个例子来解释它。

设置A - 开始

  • 我定义了一个自定义Member对象,相应的MemberRouteMemberView类和名为member的模板。
  • Member对象有一些属性,例如idnickname等。
  • 注意:没有定义MemberController形式的控制器,因此通过ember的约定,它自己提供控制器。

设置B - 自定义

  • 与设置A相同,但现在定义了MemberController,其中包含从模板中触发的一些操作方法。

奇怪的行为(相反,我不完全理解)

    设置A中的
  • ,我可以直接使用Member{{id}}来引用{{nickname}}的属性。
  • 设置B中的
  • ,我必须使用{{content.id}}{{content.nickname}}

如ember文档中所述,MemberView执行

setupController : function(controller, member) {
    controller.set('content', member);
},

那么,有人可以帮助我理解为什么差异和差异在哪里?目前,我的猜测是

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

  • 由ember自动提供的默认控制器,具有一些不能直接用于自定义控制器的额外魔法。

非常感谢任何帮助理解这一点。到目前为止,我已经花了很长时间。我首先想到的可能是项目设置与requireJS引入的模块化(好吧,我仍然认为可能会产生影响)。 Ember是v1.0pre4。

提前致谢! 帕特里克

2 个答案:

答案 0 :(得分:8)

  

那么,有人可以帮助我理解为什么差异和差异在哪里?目前,我的猜测也是   模板的上下文是不同的(可能在控制器的设置中缺少代码片段?)   要么   由ember自动提供的默认控制器,具有一些额外的魔力,不能直接用于自定义控制器。

如果没有看到您的代码,很难肯定地说,但我最好的猜测是MemberController扩展Ember.Controller。 ember提供的默认值(在此方案中)可能是Ember.ObjectController。如果这是您想要的,请将您的MemberController定义更改为:

App.MemberController = Ember.ObjectController.extend({
  myProperty: 'value'
});

objectController充当它的content属性的代理,通常是一个ember模型。因此,如果连接正确,您就不需要通过'content`属性访问模型。如果您看到类似的内容:

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

这表明您应该更改为ObjectController。见EMBER GUIDES: REPRESENTING A SINGLE MODEL!有关更详细的解释。

答案 1 :(得分:0)

ObjectController充当设置为控制器内容的对象的代理。如果未定义控制器,Ember将为您创建一个控制器,并默认将其内容设置为路径中model() function(如果已定义)返回的任何对象。无论您是定义自己的控制器还是让Ember为您定义一个

,行为都应该相同

模板中的默认上下文是控制器本身,即this = an instance of your controller or the generated one。当您尝试在该上下文中访问昵称时,Ember将首先尝试针对控制器本身解析它,如果找不到任何内容,它会根据其内容解析它,即如果您已手动将其设置为控制器的内容,则将其解析。

最后,路由中没有model() function的默认实现,除非您使用动态网址say /foo/id that resolves against /foo/:id时,Ember使用提供的ID来加载提供了ID的Foo对象,从而为model()函数提供默认实现。最后它归结为相同的机制,只是为了您的方便而自动化。

我建议你听一下this,了解更多有关Ember如何为您自动化的见解。但是当涉及到显示的内容时,你不必手动连接控制器的内容。