得到'this'与named thenable

时间:2014-02-22 11:20:10

标签: ember.js

我在Ember中遇到了承诺并且遇到了一个问题,我可以在匿名函数中使用代码但是更喜欢命名函数提供的清晰度但是在这样做时我放弃了对this的引用。

所以,例如,我有一个名为'enumeration'的Ember Data模型,因此我创建了一个帮助器类,我可以在其中指定enumName属性,并在评估promise时enumList得到填充了适当的枚举记录的结果:

module.exports = App.Enumeration = Ember.Object.extend({

    // reference to the ember-data store
    store: null,
    // this is the 'id' of in the enum model
    enumName: null,         
    // the enum is converted to a promise and either looked up using the Enum model or passed through as an array
    enumPromise: null,
    enumChanged: function() { 
        var _this = this;
        this.set('enumPromise', this.get('store').find('enum', enumeration)
            .then(function(success) {
                _this.set('enumList', success.get('data'));
            })
        );
    }.observes('enumName'), 

    enumList: []
});

这似乎按预期工作,但是我希望将then(success,fail)调用发送到命名函数:

module.exports = App.Enumeration = Ember.Object.extend({

    // reference to the ember-data store
    store: null,
    // this is the 'id' of in the enum model
    enumName: null,         
    // the enum is converted to a promise and either looked up using the Enum model or passed through as an array
    enumPromise: null,
    enumChanged: function() { 
        var enumeration = this.get('enumName');
        var _this = this;
        this.set('enumPromise', this.get('store').find('enum', enumeration)
            .then(this.successfulEnumRetrieval,this.failedEnumRetrieval);
        );
    }.observes('enumName'), 

    enumList: [],

    successfulEnumRetrieval: function(result) {
        this.set('enumList', result);
    },
    failedEnumRetrieval: function(error) {
        console.log('failed retrieving enumeration: ', error)
    }
});

我遇到的问题是如何访问App.Enumeration的上下文(又名“this”)。在命名函数中,他们不知道抱怨set()不是对象的一部分。我怀疑这是一个更广泛的Javascript范围问题,但无论是“承诺”问题还是“javascript范围”问题,我都可以使用一些帮助。

1 个答案:

答案 0 :(得分:1)

当你说这是一个更广泛的Javascript范围问题时,你是对的。好吧,这不是问题。正确的方法是使用Function.prototype.bind()。关于它,这是一个很好的article

您可以在代码中使用它。

this.set('enumPromise', this.get('store').find('enum', enumeration)
    .then(function(success) {
        this.set('enumList', success.get('data'));
    }.bind(this))
);