Javascript会返回不同的值

时间:2015-09-24 13:15:28

标签: javascript jquery backbone.js

我正在创建一个简单的Backbone.js待办事项列表。

在我的视图初始化中,我有:

    var TodoView = Backbone.View.extend({
        render: function() {
            var html = '<input type="text" value="' + this.model.get('title') + '">';
            $(this.el).html(html);
        },
       initialize: function () {
            var thisView = this;
            console.log(thisView.model.toJSON()); // <- this works
            $(this.el).change(function (thisView) {
                console.log(thisView.model.toJSON()); // <- thisView is not View here
                thisView.model.set('title', $(this).val());
            });
       }
    });

我也试过这个:

       setTitle: function () {
           console.log(this); // <- this doesn't return View
       },

       initialize: function () {
           $(this.el).change(this.setTitle)
       }

1 个答案:

答案 0 :(得分:1)

Javascript中changeclick和其他jQuery'事件'方法的回调只有一个参数:触发的事件。

var TodoView = Backbone.View.extend({
    render: function() {
        var html = '<input type="text" value="' + this.model.get('title') + '">';
        $(this.el).html(html);
    },
   initialize: function () {
        var thisView = this;
        console.log(thisView.model.toJSON()); // <- this works
        $(this.el).change(function (event) {
            console.log(thisView.model.toJSON()); // <- this works also
            thisView.model.set('title', $(this).val());
        });
   }
});

但你不应该这样做。你几乎不应该直接调用jQuery $。您应该使用视图的event属性。

对于第二部分,您可以这样做:

initialize: function () {
    var view = this;
    $(this.el).change(function () {
        view.setTitle();
    });
}

或者这个:

initialize: function () {
    var view = this;
    // Beware: the first and only argument that setTitle() will receive is the event
    $(this.el).change(this.setTitle.bind(this));
}