【问题标题】:Ember "this" undefined in componentEmber“this”在组件中未定义
【发布时间】:2023-03-18 11:07:02
【问题描述】:

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

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

import Ember from 'ember';

export default Ember.Component.extend({
  progress: 0,
  game: Ember.inject.service(),
  events: this.get("game.challenges")
});

如何this在上面的代码中是未定义的?怎么不绑定任何作用域?

我已经投入了这样的调试器:

init() {
  debugger
},

如果我注销this.get("game"),它会返回预期值。

我还尝试将服务放入 init 中,但仍未定义。我试过注销这个,这也是未定义的。

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

【问题讨论】:

标签: javascript ember.js


【解决方案1】:

详述汤姆的回答:

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

  • 在函数之外,它是全局上下文(在浏览器中,通常是 window 对象)。
  • 在函数内部,它是调用函数的对象。例如,如果你写obj.f(),那么thisf() 中将是obj。如果直接调用该函数,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,……

【讨论】:

  • 我之前试图理解this 的方式是它基于函数的调用方式。我认为我遇到的问题是因为它在一个框架中,我不确定是否还有其他事情在起作用。我还认为它会在组件中找到,因为我不确定 Ember 是如何在幕后工作的。不过,您的解释很有道理,我对发生了什么有了更好的了解。
【解决方案2】:

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

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

如果您只是希望它与服务中的值相同,您可以像这样给它起别名:

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

【讨论】:

  • 问题不在于计算属性,而是根本没有定义。如果我尝试基于服务的属性创建计算属性,则会失败,因为它会收到类型错误。
  • 我可能不得不将其设为别名。我最初想将数字转换为百分比,但这可能是不可能的。
  • this 如果您只是按照您当前拥有的方式将其扔到那里,那么它就会脱离上下文,所以它当然是未定义的。将其包装在您自己的函数或 Ember.computed 函数中,它将正确引用您的组件。
  • 好吧,我猜你为什么不能拥有从服务继承的组件的属性是没有意义的。我不希望他们采取行动。我希望酒吧的价值基于其他地方发生的事情。我很高兴至少我现在知道了。也许我只是将代码移动到服务中,然后只是为您显示的值设置别名。感谢您的帮助。
  • javascript 中的 this 将引用外部上下文,因此按照您的方式,没有外部上下文,因为这是一个独立存在的模块。这就是为什么当你将它包装在一个函数中时,外部上下文将成为 Ember.Component。这是一个简化的例子jsbin.com/xagoyemanu/edit?js,console
猜你喜欢
  • 2020-03-03
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 2020-07-18
  • 2016-04-03
  • 1970-01-01
  • 2015-09-25
相关资源
最近更新 更多