函数_.bind()不会绑定对象

时间:2017-01-09 22:28:07

标签: javascript events backbone.js underscore.js sugarcrm

当字段CreateView发生变化时,我有一个视图类扩展了SugarCRM this,我想this.model checkMonths在函数starting_months_cthis.get(),所以我可以输入this.model.get()而不是/** * @class View.Views.Base.DoVPCreateView * @alias SUGAR.App.view.views.DoVPCreateView * @extends View.Views.Base.CreateView */ ({ extendsFrom: 'CreateView', initialize: function(options) { this._super('initialize', arguments); // .... this.model.on('change:starting_month_c', _.bind(this.checkMonths, this.model)); // .... }, checkMonths: function() { if (this.get('starting_month') == 12) { // .... } }

.on()

不幸的是,这个结构不起作用。我想知道,也许是因为object.on(event, callback, [context]) 函数以某种方式设置了上下文本身?

我在文档中发现,您可以将上下文作为第三个参数传递给函数

this

我试过了,但结果仍然相同 - 视图为model,而不是$MYarray = array($ARRAY_Data);

2 个答案:

答案 0 :(得分:2)

快速修复

直接将上下文提供给.on

this.model.on('change:starting_month_c', this.checkMonths, this.model);

但这样做只是一个误导性的解决方案。视图的函数应该都是this作为视图实例而不是其他任意对象。

// a simple example view
var View = Backbone.View.extend({
  initialize: function() {
    console.log("View init, month:", this.model.get('month'));
    
    // bind the context
    this.model.listenTo(this.model, "change:month", this.checkMonth);
  },
  // the callback
  checkMonth: function() {
    // here, `this` is the model which you should NOT do.
    // but for demonstration purpose, you can use `this.get` directly.
    console.log("checkMonth:", this.get('month'));
  },
});

// sample for the demo
var model = new Backbone.Model({
    month: 2 // dummy value
  }),
  view = new View({
    model: model
  });

console.log("change month");
model.set({
  month: 3 // set to trigger the callback
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>

真正修复

如果您总是希望在此模型的任何实例中starting_month_c发生更改时触发检查“月份”回调,则可以将其移至模型类本身。

var Model = Backbone.Model.extend({
    initialize: function() {
        // favor listenTo over `on` or `bind`
        this.listenTo(this, 'change:starting_month_c', this.checkMonths);
    },
    checkMonths: function(model, value, options) {
        if (this.get('starting_month') === 12) {
            // whatever you want
        }
    }
});

如果只是针对此特定视图,在回调中使用this.model.get,因为它应该是。这不是问题,这是标准的做法。

有关favor listenTo的原因的更多信息。

答案 1 :(得分:0)