0

在我的 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

4

3 回答 3

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');
        }
    }
});

这里提到了管理控制器之间的依赖关系。

于 2013-10-10T08:41:05.550 回答
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: Object [object global] has no method 'get'在forEach里面...
  • 在 ember 中最好使用提供的 api 函数,在数组控制器中我们有 addObject,这样可以通知绑定并相应地更新布局

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

于 2013-10-10T10:16:27.843 回答
0

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

就像是

App.swatchesController = App.SwatchesController.create({});

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

  parse: function () {
     App.swatchesController.push('#fff'); 
  }
于 2013-10-10T08:40:44.997 回答