了解Backbone.js概念

时间:2013-07-17 12:01:14

标签: javascript jquery backbone.js requirejs

我正在尝试学习Backbone.js。 在我的使用Backbone和RequireJS的应用程序中,我有以下代码;

define([
    'base/BaseView',
    'model/BaseModel',
    ], function(BaseView, 
        BaseModel){
        var myView = BaseView.extend({
            initialize: function() {
                this.Summary = new resultSummary({
                    scenId : this.options.scenario.get("scenId")
                });
            },
            renderCount : function(){
                var self = this;
                var currentStatus = self.model.get("myStatus");
            }
            render: function () {
            var self = this;
            var gridItems = [];
            gridItems.push({
                    id: "company.status", 
                    text: "Status",
                    width: "200px",
                    renderer: function() {
                        var partnerStatus = this.company.get("status");
                    }
            });     
            }
        }
    });

我对一些概念不太清楚;

  1. 当我们说var self = this时,“这个”究竟代表什么(我想将此理解为一般性问题以及在JS代码中任何地方使用“this”时的含义)
  2. 如果我们在上面的代码中处于“render”状态时在renderCount Vs中初始化Vs,那么“this”会改变吗?
  3. 对于代码“this.company.get(”status“)”,this.company究竟代表什么?这是指模型吗?

2 个答案:

答案 0 :(得分:2)

我想你在问关闭?

我们分配

var self = this;

所以我们可以在嵌套函数中保留类的范围。在这种情况下:

renderer: function() {
                    var partnerStatus = this.company.get("status");
                }

这是一个很好的阅读:"Closures - JavaScript | MDN"

答案 1 :(得分:2)

我可能无法回答所有问题,因为有问题的代码可能是从较大的代码库中复制而来的。

  1. 为什么我们使用var self = this;当执行上面的代码时,这究竟代表什么?
  2. var self = this; 用于避免范围问题。有时,当您使用回调时,可能会更改为其他对象。有问题的代码不会以任何方式从中受益这个可以直接使用。

    有用的示例 - 让我们说,我们需要监听模型中的更改,并且我们希望在initialize方法中附加处理程序并从更改视图中调用一些逻辑:

    // view code
    initialize: function() {
        console.log(this); // 'this' points to view
        this.listenTo(this.model, "change", function() {
            console.log(this); // 'this' points to model
            // calling 'this.someLogic();' would throw exception
        });
    },
    
    someLogic: function() {
        // ..
    }
    

    为避免第一个示例中描述的问题,您需要将视图上下文中的“this”存储在其他变量中(不必命名为self)。

    重写的例子:

    // view code
    initialize: function() {
        console.log(this); // 'this' points to view
        var self = this; // store this into variable that will won't be changed in different scope
        this.listenTo(this.model, "change", function() {
            console.log(this); // 'this' points to model
            console.log(self); // 'self' points to view
            self.someLogic(); // won't throw
        });
    },
    
    someLogic: function() {
        // ..
    }
    

    我建议您检查JavaScript中的闭包是如何工作的。它不仅适用于Backbone,而且适用于JavaScript开发。

    1. 如果我们在上面的代码中处于“render”状态时在renderCount Vs中初始化Vs,那么“this”会改变吗?
    2. 不,Backbone会将'this'指向view对象,其中包含那些方法。

      1. 对于代码“this.company.get(”status“)”,this.company究竟代表什么?这是指模型吗?
      2. 不知道,我只能猜测,它是来自 BaseView

        的一些属性