2012-02-29 108 views
3

我的模型和集合看起来像这样。无法在骨干模型上调用自定义方法

var MyModel= Backbone.Model.Extend({ 

    foo: function(){ 
     alert("is not working..."); 
    } 
}); 

var MyCol = Backbone.Collection.extend({ 

    models:MyModel, 
    url: function(){ return '/json_from_server' }, //json data mapped to MyModel 
    poo:function(){ 
     alert("this works"); 
    } 
}); 

cols = new MyCol(); 

cols.fetch({ 

    success:function() { 
    cols.poo(); //this works fine 
     cols.models.forEach(function(item){ 
      alert(item.get("id")); //It works fine 
      alert(item.foo()); // this is not working... 
     });  
    } 
}); 

调用item.foo()时,浏览器会引发错误:未捕获的类型错误:对象的翻译:有没有方法“富” 任何人可以帮助我弄清楚发生了什么事情错在这里。

回答

5

在你MyCol对象,设置models: MyModel。我相信模型不应该是复数,所以它应该是model: MyModel

如果仍然无法正常工作,您可能需要像这样在你为MyModel一个_.bindAll:

var MyModel= Backbone.Model.Extend({ 
    initialize: function() { 
     _.bindAll(this, "foo"); 
    }, 
    foo: function(){ 
     alert("is not working..."); 
    } 
}); 

你的初始化没有工作的原因前面已经因为如上所述,你有“模型“作为复数时它应该只是model

+0

谢谢你的工作。 – bhochhi 2012-02-29 23:34:36

4

在初始化中添加bindAll应该修复它。

var MyModel= Backbone.Model.Extend({ 
    initialize: function() { 
     _.bindAll(this); 
    }, 
    foo: function(){ 
     alert("is not working..."); 
    } 
}); 
+1

仍然没有工作。有一件事我注意到,初始化方法没有被调用(我认为它应该),当获取集合时。我发现cols中充满了模型,但不会调用模型的“初始化”。我想知道为什么? – bhochhi 2012-02-29 08:23:59

+1

我在外面创建了模型对象:var mod = new MyModel(); mod.foo();这个工程甚至不使用_.bindAll(this)。我不知道为什么它通过集合获取时不工作。 – bhochhi 2012-02-29 08:57:45

+1

我认为使用抓取存在一些问题。相反,我用下面的方式工作。如果有人仍然有使用fetch的解决方案,我将不胜感激。 $ .getJSON( '// json_from_server',函数(数据){ 如果(数据){ VAR COLS =新MyCol(); _(数据).MAP(功能(I){ cols.add( new MyModel(i)); }); } }); – bhochhi 2012-02-29 09:08:14