从对象声明中访问变量

Accessing variables from object declaration

本文关键字:访问 变量 声明 对象      更新时间:2023-09-26

这可能是一个简单的问题,但我花了一些时间,我不知道该怎么做。

我有一个骨干模型,我试图传递myData作为参数到MyModels在namedAttributes。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;
      }
    },
});

您需要使namedAttributes成为一个函数,以便它具有正确的上下文(然后在运行时对其进行评估)。由于这个原因,Backbone的许多属性也可以是返回值的函数(例如className, attributes等)——如果你想执行逻辑来决定返回值将是什么。下划线有一个名为_.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;
      }
    },
});

_.result(this, 'namedAttributes')可以得到namedAttributes的值。

如果它确实是一个函数,并且您想将attrs传递给它,那么this.namedAttributes.call(this, attrs)就可以了。_.result用于既可以是对象也可以是函数