灰烬3计算属性获取器设置器

时间:2019-04-26 05:04:35

标签: javascript ember.js ember-cli

使用Ember v3.x,在为计算属性设置值方面是否有所改变? 在我的课堂上,我有一个名为“ cp1”的CP

在Ember 2.x之前,我曾经做过

this.cp1 = cp1

但是对于Ember 3.x,以上操作无效。我需要更新用Ember 3.x设置CP的方式吗?

2 个答案:

答案 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;
    });
  }
});