1

我一直在关注我发现的 javascript示例代码。看起来示例和当前版本的 Spine 有点不同,因为我的代码几乎完全相同。上涨是我的电话之一没有得到代理。

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 在代理列表中,它似乎也没有代理任何内容。有任何想法吗?

4

2 回答 2

2

Spineproxied最近不再使用阵列。

相反,您应该能够删除数组并使用该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));
},
于 2012-05-10T21:15:05.433 回答
0

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

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

addOne: (item) =>
    # do your stuff with item in the context of the @ you would expect
于 2012-06-02T18:12:17.530 回答