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()
    。如果直接调用函数,
    将保持当前状态
在您的代码中,JS引擎当前正在函数外部执行(它准备调用
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");
  })
});