Spine不代理事件处理程序

时间:2012-05-10 20:56:57

标签: spine.js

我一直在追踪我发现的javascript sample code中的脊椎。看起来样本和脊柱的当前版本略有不同,因为我的代码几乎完全相同。上升是我的一个电话没有得到代理。

exports.UrlsList = Spine.Controller.create({
  elements: {
      ".items": "items",
      "form": "form",
      "input": "input"
  },
  events: {
    "submit form": "create"
  },

  proxied: ["render", "addAll", "addOne"],

  init: function(){
    Url.bind("create",  this.addOne);
    Url.bind("refresh", this.addAll);
  },

  addOne: function(url){
    var view = Urls.init({item: url});  // The is another controller
    this.items.append(view.render().el); //This is where the error occurs
  },

  addAll: function(){
    Url.each(this.addOne);
  },

  create: function(e){
    e.preventDefault();
    var value = this.input.val();

    if (value) {
      Url.create({content: value});
    }

    this.input.val("");
    this.input.focus();
  }
});

当调用addOne函数时,它会在Url的上下文中调用,而不是在当前类的上下文中调用。它似乎不代理任何东西,即使addOne在代理列表中。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

Spine最近离开proxied数组使用。

相反,您应该能够删除数组并使用proxy函数:

init: function(){
    Url.bind("create", this.proxy(this.addOne));
    Url.bind("refresh", this.proxy(this.addAll));
},

addAll: function(){
    Url.each(this.proxy(this.addOne));
},

答案 1 :(得分:0)

这就是我最近喜欢CoffeeScript的原因,因为你可以使用胖箭来获得相同的效果:

init: ->
    Url.bind("create", @addOne)

addOne: (item) =>
    # do your stuff with item in the context of the @ you would expect