Javascript Backbonejs在保存成功处理程序中获取视图

Javascript Backbonejs在保存成功处理程序中获取视图,javascript,jquery,backbone.js,Javascript,Jquery,Backbone.js,我已经为此搜索了大约2个小时,但找不到任何东西,所以我就问一下 我正在尝试第一次使用Backbonejs,目前我正在尝试进行ajax调用并处理结果。我知道这可能不是应该使用的函数模型,但我只是尝试一下,想知道如何在其他情况下使用它 var Login = Backbone.Model.extend({ url: WEBSITE_PATH+'login', }); var loginView = Backbone.View.extend({ events:{ 'su

我已经为此搜索了大约2个小时,但找不到任何东西,所以我就问一下

我正在尝试第一次使用Backbonejs,目前我正在尝试进行ajax调用并处理结果。我知道这可能不是应该使用的函数模型,但我只是尝试一下,想知道如何在其他情况下使用它

var Login = Backbone.Model.extend({
    url: WEBSITE_PATH+'login',
});
var loginView = Backbone.View.extend({
    events:{
        'submit form': 'login'
    },

    login: function(e){
        e.preventDefault();
        this.model.save({
            username: $(e.currentTarget).find('#username').val(),
            password: $(e.currentTarget).find('#password').val()
          }, {
            success: this.onSuccess,
            error: this.onError
        });
    },

    onSuccess: function(model, response){
        console.log(this); //Returns Window object
        // - - - - - ^ -> I need view object in order to get the $el and show result
    }
}
$(document).ready(function(){
    var login = new Login();
    new loginView({ el: $('#loginForm'), model: login });
});
在模型对象中,没有返回视图的参照。 我可以全局搜索页面以显示结果,但这违背了使用主干网的目的

目标:在onSuccess中执行类似于
$(this.el).find(“#result_message”).html(response.message)


我是否以错误的方式看待这个问题?我应该以不同的方式来处理这个问题,还是有办法获取视图对象?

您可以使用jQuery
proxy
函数

success: $.proxy(this.onSuccess, this)

您可以使用jQuery
proxy
函数

success: $.proxy(this.onSuccess, this)

有几种方法可以解决这个问题

.bindAll

var LoginView = Backbone.View.extend({
    events:{
        'submit form': 'login'
    },

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

    login: function(e){
        e.preventDefault();
        this.model.save({
            username: $(e.currentTarget).find('#username').val(),
            password: $(e.currentTarget).find('#password').val()
          }, {
            success: this.onSuccess,
            error: this.onError
        });
    },

    onSuccess: function(model, response){
        console.log(this);
    }
});
var LoginView = Backbone.View.extend({
    events:{
        'submit form': 'login'
    },

    login: function(e){
        e.preventDefault();
        this.model.save({
            username: $(e.currentTarget).find('#username').val(),
            password: $(e.currentTarget).find('#password').val()
          }, {
            success: _.bind(this.onSuccess, this),
            error: _.bind(this.onError, this)
        });
    },

    onSuccess: function(model, response){
        console.log(this);
    }
});
.bind

var LoginView = Backbone.View.extend({
    events:{
        'submit form': 'login'
    },

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

    login: function(e){
        e.preventDefault();
        this.model.save({
            username: $(e.currentTarget).find('#username').val(),
            password: $(e.currentTarget).find('#password').val()
          }, {
            success: this.onSuccess,
            error: this.onError
        });
    },

    onSuccess: function(model, response){
        console.log(this);
    }
});
var LoginView = Backbone.View.extend({
    events:{
        'submit form': 'login'
    },

    login: function(e){
        e.preventDefault();
        this.model.save({
            username: $(e.currentTarget).find('#username').val(),
            password: $(e.currentTarget).find('#password').val()
          }, {
            success: _.bind(this.onSuccess, this),
            error: _.bind(this.onError, this)
        });
    },

    onSuccess: function(model, response){
        console.log(this);
    }
});
收听模型的
更改
事件

var LoginView = Backbone.View.extend({
    events:{
        'submit form': 'login'
    },

    initialize: function() {
        this.listenTo(this.model, 'change', this.onSuccess);
    },

    login: function(e){
        e.preventDefault();
        this.model.save({
            username: $(e.currentTarget).find('#username').val(),
            password: $(e.currentTarget).find('#password').val()
          }, {
            success: this.onSuccess,
            error: this.onError
        });
    },

    onSuccess: function(model, response){
        console.log(this);
    }
});

任何人都应该为你做

有几种方法可以解决这个问题

.bindAll

var LoginView = Backbone.View.extend({
    events:{
        'submit form': 'login'
    },

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

    login: function(e){
        e.preventDefault();
        this.model.save({
            username: $(e.currentTarget).find('#username').val(),
            password: $(e.currentTarget).find('#password').val()
          }, {
            success: this.onSuccess,
            error: this.onError
        });
    },

    onSuccess: function(model, response){
        console.log(this);
    }
});
var LoginView = Backbone.View.extend({
    events:{
        'submit form': 'login'
    },

    login: function(e){
        e.preventDefault();
        this.model.save({
            username: $(e.currentTarget).find('#username').val(),
            password: $(e.currentTarget).find('#password').val()
          }, {
            success: _.bind(this.onSuccess, this),
            error: _.bind(this.onError, this)
        });
    },

    onSuccess: function(model, response){
        console.log(this);
    }
});
.bind

var LoginView = Backbone.View.extend({
    events:{
        'submit form': 'login'
    },

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

    login: function(e){
        e.preventDefault();
        this.model.save({
            username: $(e.currentTarget).find('#username').val(),
            password: $(e.currentTarget).find('#password').val()
          }, {
            success: this.onSuccess,
            error: this.onError
        });
    },

    onSuccess: function(model, response){
        console.log(this);
    }
});
var LoginView = Backbone.View.extend({
    events:{
        'submit form': 'login'
    },

    login: function(e){
        e.preventDefault();
        this.model.save({
            username: $(e.currentTarget).find('#username').val(),
            password: $(e.currentTarget).find('#password').val()
          }, {
            success: _.bind(this.onSuccess, this),
            error: _.bind(this.onError, this)
        });
    },

    onSuccess: function(model, response){
        console.log(this);
    }
});
收听模型的
更改
事件

var LoginView = Backbone.View.extend({
    events:{
        'submit form': 'login'
    },

    initialize: function() {
        this.listenTo(this.model, 'change', this.onSuccess);
    },

    login: function(e){
        e.preventDefault();
        this.model.save({
            username: $(e.currentTarget).find('#username').val(),
            password: $(e.currentTarget).find('#password').val()
          }, {
            success: this.onSuccess,
            error: this.onError
        });
    },

    onSuccess: function(model, response){
        console.log(this);
    }
});

任何人都应该为你做

下划线和可能是主干应用程序中更自然的选择。下划线和可能是主干应用程序中更自然的选择。感谢您提供更多的示例:)引诱主干非常困难,但我正在一点一点地做到这一点。没问题,很高兴为您提供帮助。主干是我最喜欢的JS LIB之一。谢谢你提供更多的例子:)吸引主干相当困难,但我正在一点一点地实现。没问题,很高兴能提供帮助。主干是我最喜欢的JS库之一。