Ember“this”在组件中未定义

时间:2015-11-08 19:13:22

标签: javascript ember.js

我正在努力制作一个随着更多挑战的完成而更新的进度条。但是,组件无法访问该属性,因为这是未定义的。

我已经注入了一个服务,我正在尝试从服务的属性创建一个计算属性。但是,除非在调试中,否则总是未定义。

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内部提供服务,但仍未定义。我已经尝试注销这个,这也是未定义的。

在继续之前有没有办法强制服务解决?我尝试过使用各种组件钩子,但它们似乎没有改变。

2 个答案:

答案 0 :(得分:4)

阐述汤姆的答案:

在JS中,this是一种特殊变量。它的含义取决于它是否在函数内部。

  • 在函数外部,它是全局上下文(在浏览器中,通常是window对象)。
  • 在函数内部,它是调用函数的对象。例如,如果您撰写obj.f(),则thisobj 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.aliasEmber.computed.equal,...

答案 1 :(得分:1)

你必须告诉Ember这是一个计算属性。计算属性在文档中有详细记录 -

http://guides.emberjs.com/v2.0.0/object-model/computed-properties/

如果您只是希望它与服务的价值相同,您可以将其设为别名:

game: Ember.computed.alias('game.challenges')