2

我的backbone.js 视图中的大多数函数都以开头,var that = this;因为在一些jQuery 辅助函数内部this不再引用主干视图。请参见下面虚拟样本中的第 08 行和第 14 行。

01. var WhateverView = Backbone.View.extend({
02.     el: '#foo',
03.     fooText: 'test',
04.     fooArray: [1, 2, 3],
05.     ajax1: function() { ... },
06.     ajax2: function() { ... },
07.     render: function() {
08.         var that = this;
09.         $.when(this.ajax1(), this.ajax2()).done(function(a1, a2) {
10.             that.renderPage(a1, a2);
11.         });
12.     },
13.     renderPage: function(a1, a2) {
14.         var that = this;
15.         $.each(this.fooArray, function(i) {
16.             alert(that.fooText);
17.         });
18.     }
19. });

骨干网(或一般的javascript)有没有办法避免这种情况?

4

3 回答 3

2

您可以使用:
$.each(this.fooArray, $.proxy(function(i) { alert(this.fooText); }, this));

或者如果您使用带下划线的主干,您可以这样做:
$.each(this.fooArray, _.bind(function(i) { alert(this.fooText); }, this));

或本机(但不适用于所有浏览器):
$.each(this.fooArray, function(i) { alert(this.fooText); }.bind(this));

希望它能解决你的问题。

于 2013-06-06T13:50:28.070 回答
1

如果可能,请避免使用“var that = this”。

我解决这个问题的模式是在所有视图(和模型)的初始化中使用下划线 bindAll 方法来保证在调用函数时,这是预期的对象。

var MyView = Backbone.View.extend({ // or model, or collection
  initialize: function (options) {
    _.bindAll(this);
    // your intitialze stuff
  }
});

您还可以使用 _.each 方法代替 $.each,这将允许您将 this 的上下文传递给迭代器函数。

_.each(someArrayOrCollection, function(x, y) {
  //whatever
}, this);
于 2013-06-06T17:11:40.283 回答
0

我想你可以用纯 js 写:

    renderPage: function(a1, a2) {         
       $.each(this.fooArray, (function(that){
         return function(i) {
             alert(that.fooText);
           };
       })(this));
    }

但恐怕它的可读性不如var that = this;

希望这无论如何都会有所帮助

于 2013-06-06T13:50:39.743 回答