将render作为回调调用时访问视图属性

时间:2013-11-25 16:51:46

标签: javascript backbone.js properties

我必须在guid函数中使用render()变量,但我只能将其传递给构造函数。我这个代码:

app.views.CompanyView = Backbone.View.extend({
    el: '#company-view',
    guid: '',

    initialize: function (options) {
        this.guid = options.guid;
    },

    render: function () {
        var guid = this.guid;
    }
});

我创建了这样的视图:

app.currentView = new app.views.CompanyView({guid: guid});

然后我将render()函数作为参数传递,以将其用作回调函数:

function call(callback){
    callback();
}

call(app.currentView.render);

我也尝试了this.guidoptionsthis.options,但所有这些都是undefined。有没有办法将此变量传递给render()函数而不使用它的参数或全局变量?这是JsFiddle example

2 个答案:

答案 0 :(得分:2)

通过此方式致电render

function call(callback){
    callback();
}

您将其称为普通函数,因此this内的render将为window。请记住,JavaScript中的this取决于函数的调用方式,而不是函数的定义方式(当然,除非您正在使用绑定函数)。

你有一些选择:

  1. 使用_.bindAll_.bind$.proxyFunction.bind,... {/ p>将render绑定到视图

    initialize: function() {
        _.bindAll(this, 'render');
    }
    

    演示:http://jsfiddle.net/ambiguous/GsUfY/

  2. 现在更常见的方法是使用函数传递上下文,然后调用回调的人使用callapply使用适当的上下文:

    function call(callback, context){
        callback.apply(context);
    }
    

    演示:http://jsfiddle.net/ambiguous/LnwPr/

  3. 手工完成:

    call(function() { v.render() });
    

    这个通常采用var _this = this;的形式,后跟一个使用_this.some_method()的匿名函数,而不是仅仅传递this.some_method作为回调。

    演示:http://jsfiddle.net/ambiguous/K2Xj4/

  4. 我更喜欢第二种选择。

答案 1 :(得分:2)

我明白了。当回调函数调用render()时,方法的调用者不再是视图本身,因此渲染中的“this”将是调用函数()的调用者。

看到这个小提琴:

http://jsfiddle.net/cn8nN/2/

var CompanyView = Backbone.View.extend({
  initialize: function (options) {
      this.guid = options.guid;
  },

  render: function () {
    console.log('hello');
    console.log(this);
  }
});

var v = new CompanyView({guid: 'the guid'});

function call(callbcak) {
  callbcak();
}

call(v.render);

如果你打开控制台,你会看到“这个”实际上是窗口。

要解决此问题,您希望将上下文绑定到自己的视图。

要做到这一点,请使用_.bindAll();

initialize: function (options) {
    _.bindAll(this, "render");
    this.guid = options.guid;
}

jsfiddle:http://jsfiddle.net/cn8nN/3/