在我的Ember应用程序中,我有一个ArrayController
,其中我创建了一个方法:
App.SwatchesController = Ember.ArrayController.extend({
push: function (color) {
var model = this.get('model');
/* do a few things */
this.set('model', model);
}
});
当我尝试从ApplicationCotroller
内的某个操作调用此方法时,我得到一个TypeError
:
App.ApplicationController = Ember.Controller.extend({
actions: {
parse: function () {
App.SwatchesController.push('#fff'); // TypeError: Object function (){/* long body here */} has no method 'push'
}
}
});
控制器方法是否应该在Ember中使用?不幸的是,官方文档仅在控制器上提供了有限的示例。
我可能可以将模型定义为App.Swatches
并直接从ApplicationController
进行管理,但我相信我不应该这样做,因为SwatchesController
的目的是什么。
答案 0 :(得分:2)
您可以尝试在ApplicationController
中使用以下代码吗?
App.ApplicationController = Ember.Controller.extend({
needs: "swatches",
swatchesController: Ember.computed.alias("controllers.swatches"),
actions: {
parse: function () {
var swatchesController = this.get('swatchesController');
swatchesController.push('#fff');
}
}
});
管理控制器之间的依赖关系是here。
答案 1 :(得分:1)
此代码基于Jackil的回复
App = Ember.Application.create();
App.ApplicationController = Ember.Controller.extend({
source:null,
needs: "swatches",
swatchesController: Ember.computed.alias("controllers.swatches"),
actions: {
parse: function () {
var source = this.get('source');
source.split(',').forEach(function (color) {
this.get('swatchesController').addObject({color:color.trim()});
},this);
}
}
});
App.SwatchesController = Ember.ArrayController.extend({});
模板也被修改
<script type="text/x-handlebars" data-template-name="swatches">
<ul>
{{#each}}
<li>{{color}}</li>
{{/each}}
</ul>
</script>
两点:
答案 2 :(得分:0)
您应该在调用其方法之前实例化控制器...在您的代码中,App.SwatchesController是一个从其他类扩展的类,而不是实例......
像
这样的东西App.swatchesController = App.SwatchesController.create({});
然后你可以在实例化的控制器上调用该方法,非capilazed控制器......
parse: function () {
App.swatchesController.push('#fff');
}