【问题标题】:Backbone Model gives this.set not a function in Model.initialize主干模型给 this.set 不是 Model.initialize 中的函数
【发布时间】:2013-05-03 12:00:46
【问题描述】:

我有一个模型在通风口监听事件 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**
    });
  }
});

【问题讨论】:

    标签: backbone.js underscore.js marionette backbone-events backbone-model


    【解决方案1】:

    您很可能忘记在模型之前添加 new 关键字,例如:

    var user = UserModel();
    
    // instead of 
    
    var user = new UserModel();
    

    【讨论】:

      【解决方案2】:

      您是否尝试过使用闭包?

      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}); 
          });
        }
      });
      

      【讨论】:

      • 谢谢 - 这行得通!我刚刚在使用上面的闭包之前检查了 firebug,'this' 实际上是窗口对象!我非常肯定地认为“this”将是模型实例!关于为什么引用“this”的任何线索现在都是 Window
      • 很难说没有看到你如何实例化模型。如果你分享你的代码,我会修改它并尝试看看发生了什么。
      • 感谢您提供帮助,唉,说起来容易做起来像许多其他依赖组件和布局/区域一样,让我可以为小提琴制作干净的可行代码! :(
      【解决方案3】:

      也许您希望this 引用当前的CostModel 实例,为此您需要将this 传递给this.vent.on 调用,以便事件回调将在模型的上下文中执行:

      this.vent.on("update:TotalCost", function(value) {
          this.set({ "totalSale": value});
      }, this);
      

      【讨论】:

      • 我尝试将“this”添加为第三个。但仍然得到同样的错误。我是否需要使用任何 _.bind 调用才能使其工作?我对使用 bind 的了解非常粗略。
      • 您是否尝试在事件正文中设置断点并检查this 是什么?
      • 是的,我刚刚签入了firebug,'this'实际上是窗口对象!我非常肯定地认为“this”将是模型实例!关于为什么引用“this”的任何线索现在都是 Window
      • 什么是this.vent?无论哪种方式,如果它的主干视图、模型或集合,this 应该引用该实例,而不是窗口。
      • vent 是 Marionette 主干插件提供的事件聚合。见:github.com/marionettejs/backbone.marionette/blob/master/docs/…
      【解决方案4】:

      这可能是由于 'set' 作用于 model 而不是 object。所以你可以,首先将你的对象转换为模型然后尝试..

      例如:

      new Backbone.Model(your_object).set('val', var);
      

      【讨论】:

        【解决方案5】:

        此错误的另一个原因可能是您尝试创建新模型而不使用“new”关键字

        【讨论】:

          【解决方案6】:

          我在使用 Parse 时遇到了这个神秘的错误。我有:

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

          ...当我应该有的时候:

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

          删除了额外的 (),现在可以正常工作了。

          【讨论】:

            【解决方案7】:

            另一个原因:

            // 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
            }
            

            【讨论】:

              猜你喜欢
              • 2015-08-30
              • 1970-01-01
              • 2012-05-18
              • 1970-01-01
              • 1970-01-01
              • 2015-06-20
              • 1970-01-01
              • 1970-01-01
              • 2015-05-30
              相关资源
              最近更新 更多