使用Ember v3.x,在为计算属性设置值方面是否有所改变? 在我的课堂上,我有一个名为“ cp1”的CP
在Ember 2.x之前,我曾经做过
this.cp1 = cp1
但是对于Ember 3.x,以上操作无效。我需要更新用Ember 3.x设置CP的方式吗?
答案 0 :(得分:2)
看看您的问题,我会立即看到两个问题,第一个是有关PASSWORD_DEFAULT
丢失的问题,第二个是您需要明确定义一个setter才能按照您希望的方式工作。我将在下面详细介绍。
关于您在Ember 2.x和Ember 3.x之间进行此更改的问题,我不记得有任何更改可以更改此行为,但是@Lux在他们对您的评论中100%正确,此内容从未得到支持行为,因此您可能做过意外的事情
因此,首先让我们谈谈使用this.set()
。 Ember具有一个对象模型,该对象模型要求您使用this.set()
更新属性,以便可以将更改通知系统的其他部分(例如模板或计算的属性)。您可以在official documentation for accessing object properties in Ember中了解有关此内容的更多信息。
要提及的第二件事是,不建议覆盖未定义setter的计算属性。对于setting computed properties without getters is officially deprecated since Ember 3.8的新开发者来说,这已经足够了,这意味着在下一个主要的Ember版本(Ember 4.0)中,默认行为将发生变化。
如果您想设置计算属性,则可以阅读documentation for defining a setter in Ember,但我也会在下面提供示例。
假设您具有结合了this.set()
和fullName()
的计算属性firstName
lastName
如果要设置此计算属性(例如,在操作中)
fullName: computed('firstName', 'lastName', function() {
return `${this.firstName} ${this.lastName}`;
}),
然后,您将覆盖计算属性的行为,并且如果您更改了this.set('fullName', 'Chris Manson');
或firstName
,它将停止更新。
如果您想实现一些实际上拆分字符串lastName
并将Chris Manson
设置为Chris
并将firstName
设置为Manson
的业务逻辑,那么您会更新您的计算属性,如下所示:
lastName
这使您可以在不删除计算属性的情况下更新计算属性
该问题已作为“我可以问一个问题”第2季第1集的一部分得到回答。如果您希望我们全面讨论该问题并通过一些示例代码进行工作,您可以在此处查看视频:{{ 3}}
答案 1 :(得分:0)
如果需要动态定义计算属性,则应使用defineProperty
:
import { defineProperty, computed } from '@ember/object';
export default Component.extend({
init() {
defineProperty(this, 'myComputedProperty', computed('someDependentKey', function() {
return null;
});
}
});