0

我已经为此搜索了大约 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 });
});

在模型对象中,没有对视图的引用。我可以全局搜索页面以显示我的结果,但这违背了使用主干的目的。

目标:做类似$(this.el).find('#result_message').html(response.message)onSuccess 的事情

我是否以错误的方式看待这个问题,我应该以不同的方式执行此操作,还是有办法获取视图对象?

4

2 回答 2

2

您可以使用 jQueryproxy函数。

success: $.proxy(this.onSuccess, this)
于 2013-06-17T14:41:45.537 回答
2

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

_.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);
    }
});

_.bind...

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);
    }
});

监听模型的change事件...

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);
    }
});

任何一个都应该为你做!

于 2013-06-17T16:02:39.370 回答