从对象声明中访问变量

时间:2015-10-02 12:59:30

标签: javascript backbone.js

这可能是一个简单的问题,但我已经花了一些时间,我无法弄清楚该怎么做。

我有一个Backbone模型,我正在尝试将myData作为参数传递给namedAttributes中的MyModels。 Bind并没有真正帮助,因为“this”是namedAttributes的上下文,而不是RS.Models.MyModel。

有什么建议吗?

RS.Models.MyModel = Backbone.Model.extend({

    myData: {},

    namedAttributes: {
      "collection": _.bind(function(attrs) {
        // "this" is the wrong context. How do I access myData from here?
        var options = {myData: this.myData};
        return new RS.Models.MyModels(attrs, options)
      }, this)
    },

    initialize: function(attributes, options) {
      if (options && options.columnData) {
        this.myData = options.myData;
      }
    },
});

1 个答案:

答案 0 :(得分:1)

您需要使namedAttributes成为一个函数,以便它具有正确的上下文(然后在运行时进行评估)。 Backbone的许多属性也可以是由于这个原因返回值的函数(例如className,属性等) - 并且如果你想执行逻辑来决定返回值是什么。为此,Underscore有一个名为_.result的函数:

RS.Models.MyModel = Backbone.Model.extend({

    myData: {},

    namedAttributes: function() {
      return {
        collection: new RS.Models.MyModels({myData: this.myData})
      };
    },

    initialize: function(attributes, options) {
      if (options && options.columnData) {
        this.myData = options.myData;
      }
    },
});

您可以使用namedAttributes获得_.result(this, 'namedAttributes')的值。

如果它绝对是一个功能,你想将attrs传递给它,那么this.namedAttributes.call(this, attrs)就可以了。 _.result适用于何时可以是对象或函数。