使用ember,我发现有时模型存储在控制器的content
属性中,有时模型也可以在控制器上直接使用。但是,在这种情况下,我不明白。
让我通过组装我的余烬MVC时发现的一个例子来解释它。
设置A - 开始
Member
对象,相应的MemberRoute
,MemberView
类和名为member
的模板。 Member
对象有一些属性,例如id
,nickname
等。MemberController
形式的控制器,因此通过ember的约定,它自己提供控制器。设置B - 自定义
MemberController
,其中包含从模板中触发的一些操作方法。奇怪的行为(相反,我不完全理解)
Member
或{{id}}
来引用{{nickname}}
的属性。{{content.id}}
或{{content.nickname}}
如ember文档中所述,MemberView
执行
setupController : function(controller, member) {
controller.set('content', member);
},
那么,有人可以帮助我理解为什么差异和差异在哪里?目前,我的猜测是
或
非常感谢任何帮助理解这一点。到目前为止,我已经花了很长时间。我首先想到的可能是项目设置与requireJS引入的模块化(好吧,我仍然认为可能会产生影响)。 Ember是v1.0pre4。
提前致谢! 帕特里克
答案 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如何为您自动化的见解。但是当涉及到显示的内容时,你不必手动连接控制器的内容。