Ember - 控制器的内容和模型属性之间有什么区别

mer*_*lin 9 javascript ember.js

在ember的官方指南中,它提供了两种设置控制器底层对象的方法.首先是设置模型属性:

App.SongsRoute = Ember.Route.extend({
    setupController: function(controller, playlist) {
        controller.set('model', playlist.get('songs'));
    }
});
Run Code Online (Sandbox Code Playgroud)

第二是设置内容属性:

MyApp.listController = Ember.ArrayController.create();

$.get('people.json', function(data) {
    MyApp.listController.set('content', data);
});
Run Code Online (Sandbox Code Playgroud)

这两个属性是否代表相同的东西?我应该使用哪种方式?

mel*_*elc 7

看起来他们是一回事,

https://github.com/emberjs/ember.js/blob/v1.3.0/packages/ember-runtime/lib/controllers/controller.js#L44

Ember.ControllerMixin = Ember.Mixin.create(Ember.ActionHandler, {
....
model: Ember.computed.alias('content'),
....
Run Code Online (Sandbox Code Playgroud)

model属性是别名content.

也,

https://github.com/emberjs/ember.js/blob/v1.3.0/packages/ember-routing/lib/system/route.js#L849

提到,

By default, the `setupController` hook sets the `content` property of
the controller to the `model`.
Run Code Online (Sandbox Code Playgroud)

UPDATE 从v1.7.0开始不推荐使用,代码放在mixin中. https://github.com/emberjs/ember.js/blob/v2.12.0/packages/ember-runtime/lib/mixins/controller.js 以及相关的弃用mixin. https://github.com/emberjs/ember.js/blob/v2.12.0/packages/ember-runtime/lib/mixins/controller_content_model_alias_deprecation.js

  • 是的,这是正确的.为了提供更多细节,我们进行了这项更改,以使API更加一致.比如想想Routes中的`model`钩子.更一致的是,此挂钩的结果被设置为匹配控制器的模型属性而不是旧的内容属性.别名仍然存在向后兼容性.**您应该始终使用model属性.** (3认同)