生成ArrayController作为ObjectController的子控制器

时间:2014-10-04 10:51:18

标签: ember.js

假设我有一个模型post链接到另一个模型commenthasMany模型的comments属性与post关系。

我创建了post ObjectControllercomments ArrayController。通常在我的post控制器中,由于它将充当代理,因此我可以访问comments模型中反映comments属性的post属性。我想定义此属性,以便它使用我的comments控制器,但不使用Route#generateController而不使用模板中的{{render...}}

简而言之,我想让comments控制器中的post属性成为我的comments控制器的实例,直接从post控制器创建。

我可以这样做:

import CommentsController from 'app/controllers/comments';
export default Ember.ObjectController.extend({
  comments: (function() {
    return CommentsController.create({model: this.get('model.comments')});
  }).property('model.comments').readOnly()
});

然后我从这个新的container实例中删除storeparentControllerCommentsController

我可以在创建新控制器时自己定义这些属性,但是不是最好的方法吗?

(请记住,postcomments控制器实例都不是单例,它们将是新的独立实例)


更新

我选择了post / comments的示例,因为它是2个模型之间众所周知的常见链接。我的用例是log / log-frame,其中log是包含clientprojectframes的模型,最后一个是{ {1}} hasMany这是我关注的问题。

在模型中,我有log-framesstartAtendAtduration可以是endAt,在这种情况下,这意味着此日志时间框架未关闭,null必须替换为endAtnow不是模型中的属性,由于durationstartAt而计算。但我想让我的模型中没有逻辑,并将此endAtendAt放在duration控制器中。然后我有一个log-frame控制器处理一个log-frames数组并处理每个持续时间的总和,最小的开始和结束,...感谢log-frame为{{1} }}。然后itemController控制器将是持有log-frame记录的控制器,并且必须创建该log控制器以将log属性保存为{{列表1}}。

如果这样做的方法是移动模型中的每个计算属性而不是控制器,那么我会这样做,但我认为除了验证之外在模型中放置太多逻辑并不是一个好习惯。这样

2 个答案:

答案 0 :(得分:0)

在模板中使用render,它会将模型包装在第一个参数指定的控制器中(它也将使用指定的模板)。

发布控制器

除非您希望将集合引用保持为只读

,否则不再需要这样做
export default Ember.ObjectController.extend({

});

在模板中使用render

{{render 'comments' comments}}

在代码中任意使用控制器并手动创建控制器实例(超出控制器/视图逻辑的范围)也是一种反模式。

答案 1 :(得分:0)

根据@ Kingpin2k的建议,我在这里使用Mixin作为参考包含答案:

import Ember from 'ember';

var CircleMixin = Ember.Mixin.create({
    circumference: function() {
        return this.get('radius')*2*Math.PI;
    }.property('radius'),
    area: function() {
        var radius= this.get('radius');
        return radius*radius*Math.PI;
    }.property('radius')
});

然后你可以在Controller s:

中使用mixin
var BigCircleController= Ember.ObjectController.extend(CircleMixin, {
    // ... etc
});

var LittleCircleController = Ember.ObjectController.extend(CircleMixin, {
    // ... etc
}

或者您可以在Model

中使用它
import DS from 'ember-data';
var CircleModel = DS.Model.extend(CircleMixin, {
    // ... etc.
});

所有人都会回复area财产的请求。