Модель магистрали дает this.set, а не функцию в Model.initialize.

У меня есть модель, прослушивающая вентиляционное отверстие для события update:TotalCost, которое запускается из (несвязанной) коллекции C при изменении любой модели M, принадлежащей коллекции C.

Это событие закодировано в методе инициализации, как показано ниже. При получении события я получаю следующую ошибку:

TypeError: this.set не является функцией
this.set({ totalsale: value});

CostModel = Backbone.Model.extend({     
  defaults: {
    totalSale: 0,
    totalTax: 0
  },

  initialize: function(attrs, options) {
    if(options) {
      if(options.vent) {
        this.vent = options.vent;
      }
    }
            
    this.vent.on("update:TotalCost", function(value) {
      this.set({ "totalSale": value}); **//ERROR HERE**
    });
  }
});

person Nilesh Kale    schedule 03.05.2013    source источник


Ответы (7)


Вы пробовали использовать замыкание?

CostModel = Backbone.Model.extend({     
  defaults: {
    totalSale: 0,
    totalTax: 0
  },
  initialize: function(attrs, options) {
    var self = this;

    if(options) {
      if(options.vent) {
        this.vent = options.vent;
      }
    }

    this.vent.on("update:TotalCost", function(value) {
      self.set({ "totalSale": value}); 
    });
  }
});
person Scott Puleo    schedule 03.05.2013
comment
Спасибо - это работает! Я только что проверил в firebug, прежде чем использовать закрытие выше, «это» на самом деле объект окна! Я так уверенно предполагал, что «это» будет образцовым экземпляром! Любые подсказки о том, почему ссылка на «это» теперь Window - person Nilesh Kale; 03.05.2013
comment
Трудно сказать, не видя, как вы создаете экземпляр модели. Если вы поделитесь своим кодом, я поиграю с ним и посмотрю, что происходит. - person Scott Puleo; 03.05.2013
comment
Спасибо за предложение помочь, увы, это легче сказать, чем сделать, так как множество других зависимых компонентов и макетов/регионов для меня, чтобы сделать чистую часть работоспособного кода для скрипки! :( - person Nilesh Kale; 04.05.2013

Вполне возможно, что вы забыли добавить ключевое слово new перед вашей моделью, например, у вас есть:

var user = UserModel();

// instead of 

var user = new UserModel();
person ismnoiet    schedule 31.03.2016

Возможно, вы хотите, чтобы this ссылалась на текущий экземпляр CostModel, для этого вам нужно передать вызов this в this.vent.on, чтобы обратный вызов события выполнялся в контексте модели:

this.vent.on("update:TotalCost", function(value) {
    this.set({ "totalSale": value});
}, this);
person Andrey Kuzmin    schedule 03.05.2013
comment
Я попытался добавить «это» в качестве третьего. Но все еще получаю ту же ошибку. Нужно ли мне использовать какие-либо вызовы _.bind, чтобы это работало? Мои знания об использовании bind очень отрывочны. - person Nilesh Kale; 03.05.2013
comment
Вы пытались установить точку останова в теле события и проверить, что такое this? - person Andrey Kuzmin; 03.05.2013
comment
Да, я только что проверил в firebug, «это» на самом деле объект окна! Я так уверенно предполагал, что «это» будет образцовым экземпляром! Любые подсказки о том, почему ссылка на «это» теперь Window - person Nilesh Kale; 03.05.2013
comment
Что такое this.vent? В любом случае, если его базовое представление, модель или коллекция, this должно ссылаться на этот экземпляр, а не на окно. - person Andrey Kuzmin; 03.05.2013
comment
vent — это агрегация событий, предоставляемая магистральным плагином Marionette. см.: github.com/ marionettejs/backbone.marionette/blob/master/docs/ - person Nilesh Kale; 04.05.2013
comment
Я вижу, что он использует миксин Backbone.Events , поэтому vent.on должен принимать контекст в качестве третьего аргумента. Понятия не имею, почему он не работает. - person Andrey Kuzmin; 04.05.2013

это может быть связано с тем, что 'set' работает с моделью, а не с объектом. поэтому вы можете сначала преобразовать свой объект в модель, а затем попробовать..

в примере:

new Backbone.Model(your_object).set('val', var);
person raman rai    schedule 07.04.2017

Другая причина этой ошибки может заключаться в том, что вы пытаетесь создать новую модель без использования ключевого слова «новая».

person codemeasandwich    schedule 19.03.2015

Я получал эту загадочную ошибку при использовании с Parse. Я имел:

Parse.User().current().escape("facebookID")

... когда я должен был:

Parse.User.current().escape("facebookID")

Убрал лишнее () и теперь все работает нормально.

person Jeremy Knight    schedule 30.05.2015

Другая причина:

// render() method in view object
setInterval(this.model.showName, 3000);

// showName() method in model object
showName: function(){
    console.log(this.get('name')); // this.get is not a function
}
person manix    schedule 22.03.2017