Backbone.js调用函数从事件处理程序呈现

时间:2014-03-05 07:46:06

标签: javascript backbone.js

我的观点是这样的:

render:function(){
    this.template = _.template(tpl.get('tplUsersManagement'));
    this.$el.html(this.template({models : this.model.models}));
    this.$el.i18n();
     $('#formAddUser')
     .on('invalid', function () {
            var invalid_fields = $(this).find('[data-invalid]');
        console.log(invalid_fields);
        })
     .on('valid', this.addUser);
        return this;
        },
addUser: function(event){
    event.preventDefault();
    var newUser = new UserModel({
        . . .
    });
    var that=this;
    newUser.save({},{
            headers:{"X-Token":"theToken"},
            statusCode:{
                202: function(){
                    that.render();//here I want to call render function
                    }
                }});
            }

        }

所以我想从我的addUser函数调用我的渲染函数。我尝试使用this = that然后that.render,但我得到了一个错误,它说:

  

未捕获的TypeError:对象#没有方法'render'

我认为这是因为在事件处理程序中这将成为我的形式。

2 个答案:

答案 0 :(得分:2)

您已经了解了上下文限制,这就是您使用var that = this技巧的原因,但还有另一个地方需要实现它:

var self = this; // I prefer "self" rather than "that" 
$('#formAddUser').on('invalid', function () {
  // handle invalid data
}).on('valid', function( ev ){
   ev.preventDefault();
   self.addUser();
   return this;
});

addUser函数是视图模块的一部分,但在valid/invalid事件处理程序中,上下文(this变量)已更改。在输入事件处理程序的范围之前,您需要保留对正确上下文(var self = this;)的引用,以便可以使用它来调用addUser()函数。

答案 1 :(得分:1)

将有2个选项。

1.使用骨干视图的事件委托。它将允许您在事件处理程序中使用视图对象。

2.将你的addUser函数绑定到此。

addUser: function() {
...
//do something
...
}.bind(this)