我正在努力制作一个随着更多挑战的完成而更新的进度条。但是,组件无法访问该属性,因为这是未定义的。
我已经注入了一个服务,我正在尝试从服务的属性创建一个计算属性。但是,除非在调试中,否则总是未定义。
import Ember from 'ember';
export default Ember.Component.extend({
progress: 0,
game: Ember.inject.service(),
events: this.get("game.challenges")
});
如何在上面的代码中定义这个?它怎么不受任何范围的束缚?
我投入了这样的调试器:
init() {
debugger
},
如果我退出this.get("game")
,它会返回预期值。
我也尝试过在init内部提供服务,但仍未定义。我已经尝试注销这个,这也是未定义的。
在继续之前有没有办法强制服务解决?我尝试过使用各种组件钩子,但它们似乎没有改变。
答案 0 :(得分:4)
阐述汤姆的答案:
在JS中,this
是一种特殊变量。它的含义取决于它是否在函数内部。
window
对象)。obj.f()
,则this
将obj
f()
。如果直接调用该函数,this
仍然保持当前状态。在您的代码中,JS引擎当前正在函数外部执行(它正准备调用extend
,并将其传递给对象)。
export default Ember.Component.extend({
game: Ember.inject.service(),
events: this.get("game.challenges")
});
因此,代码中的this
引用window
对象。您使用computed property修复了这个问题,即在访问该属性时在您的对象上调用的函数:
export default Ember.Component.extend({
game: Ember.inject.service(),
events: Ember.computed('game.challenges', function() {
return this.get("game.challenges");
})
});
您可以在函数中执行所需的任何计算。只记得结果所依赖的任何内容必须列在property()
内,以便Ember知道何时重新计算它。
最后,对于一些常见情况,ember会提供一些shortcuts,例如Ember.computed.alias
,Ember.computed.equal
,...
答案 1 :(得分:1)
你必须告诉Ember这是一个计算属性。计算属性在文档中有详细记录 -
http://guides.emberjs.com/v2.0.0/object-model/computed-properties/
如果您只是希望它与服务的价值相同,您可以将其设为别名:
game: Ember.computed.alias('game.challenges')