Javascript 余烬“;这";组件中未定义的
我正在尝试制作一个进度条,随着更多挑战的完成而更新。但是,组件无法访问该属性,因为该属性未定义 我已经注入了一个服务,我正试图从该服务的属性创建一个计算属性。但是,除非在调试中,否则这始终是未定义的Javascript 余烬“;这";组件中未定义的,javascript,ember.js,Javascript,Ember.js,我正在尝试制作一个进度条,随着更多挑战的完成而更新。但是,组件无法访问该属性,因为该属性未定义 我已经注入了一个服务,我正试图从该服务的属性创建一个计算属性。但是,除非在调试中,否则这始终是未定义的 import Ember from 'ember'; export default Ember.Component.extend({ progress: 0, game: Ember.inject.service(), events: this.get("game.challenges
import Ember from 'ember';
export default Ember.Component.extend({
progress: 0,
game: Ember.inject.service(),
events: this.get("game.challenges")
});
在上面的代码中,这怎么可能是未定义的?它如何不受任何范围的约束
我加入了一个调试器,如下所示:
init() {
debugger
},
如果我退出this.get(“游戏”)
它将返回预期值
我还尝试将服务放在init内部,但尚未定义。我尝试过注销这个,但也没有定义
是否有办法在继续之前强制解决服务问题?我尝试过使用各种组件挂钩,但它们似乎没有改变任何事情。您必须告诉Ember这是一个计算属性。计算属性在文档中有很好的文档记录- 如果您只希望它与服务中的值相同,可以将其别名如下:
game:Ember.computed.alias('game.challenges')
详细说明Tom的答案:
在JS中,是一种特殊的变量。它的含义取决于它是否在函数内部
- 函数外部是全局上下文(在浏览器中,通常是
对象)窗口
- 在函数内部,它是调用函数的对象。例如,如果您编写
,那么obj.f()
将是这个
中的obj
。如果直接调用函数,f()
将保持当前状态此
extend
,向其传递一个对象)
因此,代码中的此
指的是窗口
对象。您可以使用,即在访问属性时在对象上调用的函数来修复此问题:
export default Ember.Component.extend({
game: Ember.inject.service(),
events: Ember.computed('game.challenges', function() {
return this.get("game.challenges");
})
});
您可以在函数中执行所需的任何计算。请记住,结果所依赖的任何内容都必须列在property()中,以便Ember知道何时重新计算它
最后,对于一些常见的情况,ember提供了一些,例如ember.computed.alias
,ember.computed.equal
,…此时的问题不是computed属性,而是根本没有定义它。如果我尝试基于服务的属性创建计算属性,它将失败,因为它在该属性上出现类型错误。我可能需要将其设置为别名。我本来想把这个数字转换成一个百分比,但这可能是不可能的。如果你只是按照你现在的方式把它扔出去,那么这个
是断章取义的,所以它当然是未定义的。将它包装在您自己的函数或Ember.computed函数中,它将正确引用您的组件。好吧,我想这就是为什么您不能拥有从服务派生的组件的属性的原因。我不想让他们采取行动。我希望酒吧的价值是基于其他地方发生的事情。我很高兴至少我现在知道了。也许我只需要将代码移动到服务中,然后像您所示那样对值进行别名。感谢您的帮助。javascript中的这个
将引用外部上下文,因此按照您的方式,没有外部上下文,因为这是一个独立存在的模块。这就是为什么当您将其包装到函数中时,外部上下文将成为Ember.Component。下面是一个简化的示例,我以前试图理解这个
的方式是,它基于函数的调用方式。我想我遇到的问题是,因为它是在一个框架中,我不确定是否还有其他因素在起作用。我还以为会在组件中找到它,因为我不确定余烬在幕后是如何设置的。不过,你的解释很有道理,我对发生的事情有了更好的了解。可能是重复的
export default Ember.Component.extend({
game: Ember.inject.service(),
events: Ember.computed('game.challenges', function() {
return this.get("game.challenges");
})
});