我可以在Ember中调用其他控制器的方法吗?

时间:2013-10-10 08:18:50

标签: javascript model-view-controller ember.js

在我的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的目的是什么。

演示:http://jsbin.com/UToDazI/3/edit?html,js,output

3 个答案:

答案 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>

两点:

  • 一般Js,里面forEach范围有变化,你可以发送第二个参数来设置这个变量, TypeError:对象[对象全局]没有方法'获取'在forEach ...
  • 里面
  • 在ember中最好使用附带的api函数,在数组控制器中我们有addObject,这样就可以通知绑定并且布局更新了

JsBin http://jsbin.com/UToDazI/6/

答案 2 :(得分:0)

您应该在调用其方法之前实例化控制器...在您的代码中,App.SwatchesController是一个从其他类扩展的类,而不是实例......

这样的东西
App.swatchesController = App.SwatchesController.create({});

然后你可以在实例化的控制器上调用该方法,非capilazed控制器......

  parse: function () {
     App.swatchesController.push('#fff'); 
  }