为Ember计算的属性相关键使用常量

时间:2019-07-04 16:38:56

标签: javascript ember.js

对于Ember应用程序,是否可以将常量用作计算的属性键的一部分?

因此,从本质上讲,我有一个如下常量;

MY_SECTION {
MY_FIELD: "my-field-id"
}

我想要的是“ my-field-id”上的计算属性,即

myCP: function() {
console.log('Inside CP...');
}.property('section.field.my-field-id.value')

但是,我希望能够将常数用于my-field-id而不是直接使用它。有可能吗?

1 个答案:

答案 0 :(得分:1)

Ola @testndtv,谢谢您的提问!是的,完全有可能在计算属性的键中使用常量,但是要使用它,您将需要使用@jelhan所提到的更现代的语法,因为.poperty()已过时。

这是我在本地测试的控制器的一个有效示例,并且可以按您期望的方式工作:

import Controller from '@ember/controller';
import { defineProperty, computed } from '@ember/object';

const PROPERTY_ID = 'some-random-string-that-is-too-long-to-write';

export default Controller.extend({
  // this is just for the example so we can show the value in the template
  // it is not needed to get this to work
  PROPERTY_ID: PROPERTY_ID,

  init() {
    this._super(...arguments);

    defineProperty(this, 'myCP', computed(PROPERTY_ID, function() {
      return this.get(PROPERTY_ID);
    }));
  },

  actions: {
    addOne() {
      // this is just for the example to stop the result always being NaN because
      // null + 1 = NaN
      let value = this.get(PROPERTY_ID) || 0;
      this.set(PROPERTY_ID, value + 1);
    }
  }
});

如您所见,我们正在使用从{@ ember / object'导入的defineProperty。您可以在API documentation

中了解更多信息

这里的关键见解是您需要在init()中为此Ember对象动态定义属性。

此控制器的相应模板如下:

Property ID is: {{PROPERTY_ID}}

<br>

And the value is: {{get this PROPERTY_ID}}

<br>

<button {{action 'addOne'}}>Add One</button>