2012-02-29 3 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(), браузер бросает ошибку: неперехваченный TypeError: Object [объект Object] не имеет метода «Foo» Может кто-нибудь помочь мне понять, что происходит не так здесь.

ответ

5

В вашем MyCol объекте, вы установите models: MyModel. Я считаю, что модели не должны быть множественными, поэтому это должно быть model: MyModel.

Если это все еще не работает, вам может понадобиться _.bindAll в ваших MyModel как так:

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

Причина вашей инициализации не работал раньше был потому что, как уже говорилось выше, вы должны были " моделей ", поскольку это должно быть только model.

+0

спасибо, что сработали. – bhochhi

4

Добавление инициализации bindAll должно быть исправлено.

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

Все еще не работает. одна вещь, которую я заметил, метод инициализации не называется (который я предполагал, что он должен), когда сбор получен. Я обнаружил, что cols заполнена моделями, но «инициализировать» модели не вызывается. Интересно, почему? – bhochhi

+1

Я создал объект модели снаружи: var mod = new MyModel(); mod.foo(); это работает даже без использования _.bindAll (this). Я не знаю, почему он не работает, когда он собирает коллекции. – bhochhi

+1

Я думаю, что есть проблема с использованием fetch. Вместо этого я использовал следующее, и он работает. Я буду признателен, если у кого-нибудь еще есть решение с использованием fetch. $ .getJSON ('// json_from_server', функция (данные) { если (данные) { вар смещ_по_столбцам = новый Mycol(); _ (данные) .map (функция (я) { cols.add (новый MyModel (i)); }); } }); – bhochhi

Смежные вопросы