澄清 Ember 的 this.get() 方法

clarification of Ember's this.get() method

这是一个比任何具体问题都更笼统的问题,但我是 ember 的新手,并不真正了解何时以及如何使用 Ember 的 this.get ('foo')(类似地 bar.get('foo'))。

例如,在我的路线中,我有一个用户对象,上面有一个名为 credits

的 属性
user = this.store.find('user', userId)
console.log(user)
credits = user.get('credits')
console.log(credits)

我的 console.log 告诉我 user.content._data.credits 有一个值,还有一个方法叫做获取内容,更具体地说,获取积分。但是,console.log积分总是 returns 未定义。

如果我将用户设置为模型,则在我的控制器中使用 this.get('user.credits') 可以正常工作。

我已经阅读了有关 .get 具有计算属性的优点的文档,但是任何人都可以简明扼要地解释一些何时使用 this.get('foo') 与 [=31 的基本规则=]('foo') 以及为什么它在某些地方有效但在其他地方无效。

谢谢!

您始终需要使用 Em.getEm.set 来获取和设置 Ember.Object 的属性。这是基本规则。没有它,您可能会在 observers/rendering 和其他地方发现各种错误。

您的代码中存在对操作流程的误解:this.store.find始终returns承诺对象,而不是您请求的实际数据。详细:

user = this.store.find('user', userId) // user - Em.RSVP.Promise object
console.log(user) // logs the Em.RSVP.Promise object
credits = user.get('credits') // gets property 'credits' of the Em.RSVP.Promise object (user)
console.log(credits) // always logs `undefined` because there is no property called 'credits' in Em.RSVP.Promise prototype

我们必须依赖 Promise 的异步特性,并像这样重写这段代码:

this.store.find('user', userId).then(function(user) {
    console.log(user) // logs the App.UserModel object with actual data
    credits = user.get('credits') // gets property 'credits' of the App.UserModel instance (user)
    console.log(credits) // logs real data from the model
});

如果您使用 ember-data 作为数据层,从模型对象获取属性还有另一个重要部分:您需要声明您希望 [=16] 的模型的所有字段=] 之后。