假设我有一个模型post
链接到另一个模型comment
,hasMany
模型的comments
属性与post
关系。
我创建了post
ObjectController
和comments
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
实例中删除store
,parentController
和CommentsController
。
我可以在创建新控制器时自己定义这些属性,但是不是最好的方法吗?
(请记住,post
或comments
控制器实例都不是单例,它们将是新的独立实例)
更新:
我选择了post
/ comments
的示例,因为它是2个模型之间众所周知的常见链接。我的用例是log
/ log-frame
,其中log
是包含client
,project
和frames
的模型,最后一个是{ {1}} hasMany
这是我关注的问题。
在模型中,我有log-frames
,startAt
和endAt
。 duration
可以是endAt
,在这种情况下,这意味着此日志时间框架未关闭,null
必须替换为endAt
。 now
不是模型中的属性,由于duration
和startAt
而计算。但我想让我的模型中没有逻辑,并将此endAt
和endAt
放在duration
控制器中。然后我有一个log-frame
控制器处理一个log-frames
数组并处理每个持续时间的总和,最小的开始和结束,...感谢log-frame
为{{1} }}。然后itemController
控制器将是持有log-frame
记录的控制器,并且必须创建该log
控制器以将log
属性保存为{{列表1}}。
如果这样做的方法是移动模型中的每个计算属性而不是控制器,那么我会这样做,但我认为除了验证之外在模型中放置太多逻辑并不是一个好习惯。这样
答案 0 :(得分:0)
在模板中使用render,它会将模型包装在第一个参数指定的控制器中(它也将使用指定的模板)。
除非您希望将集合引用保持为只读
,否则不再需要这样做export default Ember.ObjectController.extend({
});
{{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: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
财产的请求。