5

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

让我通过一个我在组装我的 ember MVC 时找到的例子来解释它。

设置 A - 开始

  • 我定义了一个自定义Member对象、对应MemberRouteMemberView类和一个名为 的模板member
  • Member对象具有一些属性,例如id,nickname等。
  • 注意:没有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。

提前致谢!帕特里克

4

2 回答 2

8

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

如果没有看到您的代码,很难确定,但我最好的猜测是您的MemberControllerextends Ember.Controller。ember 提供的默认值(在这种情况下)是Ember.ObjectController. 如果这是您想要的,请将您的 MemberController 定义更改为:

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

objectController 充当其content属性的代理,通常是 ember 模型。因此,如果连接正确,您将永远不需要通过“内容”属性访问模型。如果你看到类似的东西:

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

这表明您应该更改为 ObjectController。请参阅EMBER 指南:代表单个模型!以获得更详细的解释。

于 2013-01-23T23:45:50.653 回答
0

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

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

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

我建议您收听这篇文章,以了解更多有关 Ember 如何为您实现自动化的见解。但是当涉及到显示的内容时,您不必手动连接控制器的内容。

于 2013-01-24T00:03:01.037 回答