如何从Emberjs中的同一个类调用另一个方法

时间:2014-04-14 20:25:09

标签: ember.js

我知道我在这里只是遗漏了一些简单但以下似乎不起作用。

App.Storage = Ember.Object.extend

  push: (key, data)-> #I want to call this from the loop below in pushMany
    #...
    #...

  pushMany: (key, data)->

    data.forEach (d)->
      #Tried:
      @push(key, d) #<< TypeError: undefined is not a function
      #Also tried:
      @send('push', key, d) #<< TypeError: undefined is not a function
      #Also tried:
      App.Storage.push(key, d) #<< TypeError: undefined is not a function

我在路线中呼叫pushMany:

App.MessagesRoute = Ember.Route.extend
  setupController: (controller, model)->
    #storage is injected to route
    #I can call storage.push here so I'm pretty sure my injection is working properly
    storage = @get('storage')
    storage.pushMany 'message', [{id: 3, value: 'Test Msg', author: 'Jules'}, {id: 4, value: 'Hello World!', author: 'Jules'}]

现在被困了几个小时。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

您的问题是对象范围。

这是一个例子:

var Test = Ember.Obejct.extend({
  func: function(){
    // the scope of "this" is the Test object
    this.get('data');

    var self = this;

    this.get('data').forEach(function(){
      // "this" is now the closure
      // use "self" to access it
      self.set('data', 'blup');

    });
  }        
});

你的案子:

App.Storage = Ember.Object.extend
  pushMany: (key, data)->
     self = this
     data.forEach (d)->
      self.push(key, d)

见这里:How do JavaScript closures work?

答案 1 :(得分:0)

问题在于你的工作非常在Ember之外。而不是使用App.Storage来存储您的值,只需在模型钩子中执行:

App.MessageRoute = Ember.Route.extend({
    model:function() {
       return [{id: 3, value: 'Test Msg', author: 'Jules'}, {id: 4, value: 'Hello World!', author: 'Jules'}]
   },
   actions: {
       addMessage:function() {
           this.get('model').pushObjects({id:5,value:'Heya',author:'Nick'});
       }
   }
});

答案 2 :(得分:0)

这个帖子不是最新的,但对于未来的旅行者参考:

我有同样的问题(我也使用CoffeeScript作为作者),并想出:

问题在于他正在使用data.forEach (d)->

这将是&#34;编译&#34;在下面,意味着thisforEach()方法的范围:

data.forEach(function(d) {
  this.push(key, d);
  this.send('push', key, d);
  return App.Storage.push(key, d);
});

实际上,应该&#34;编译&#34;进入这样的事情:

  this.data.forEach((function(_this) {
    function(d) {
      // your code here, using '_this' and 'd'

      _this.push(key, d);
      _this.send('push', key, d);
      return App.Storage.push(key, d);

    };
  })(this));

有用的资源: