EmberJS计算的“与”取反

时间:2019-07-09 16:44:56

标签: typescript ember.js

我有一个带有属性的类:

import { and, not } from '@ember/object/computed';

EmberObject.extend({
    a: false,
    notA: not('a'),

    b: true,
    c: true,
    d: and('b', 'c', 'notA')
});

所以d依赖于a的取反。

是否有一种注释可以做类似d: and('b', 'c', '!a')的事情,这样我就不需要多余的notA属性?

2 个答案:

答案 0 :(得分:1)

您可以使用ember-awesome-macros,它支持编写宏:

import { and, not } from 'ember-awesome-macros';

EmberObject.extend({
    a: false,
    b: true,
    c: true,
    d: and('b', 'c', not('a'))
});

答案 1 :(得分:0)

  

有没有做类似...的标记

不。但是,您可以对完整的计算出的程序进行编程:

d: computed('a', 'b', 'c', function() {
  return !this.a && this.b && this.c;
}),

不过,您可以使用以下内容自行构建:

function betterAnd(...props) {
  const positiveDeps = props
    filter(x => !x.startsWith('!'));
  const negativeDeps = props
    .filter(x => x.startsWith('!'))
    .map(x => x.substr(1));
  return computed(...positiveDeps, ...negativeDeps, function() {
    return [
      ...positiveDeps.map(x => this.get(x)),
      ...negativeDeps.map(x => !this.get(x)),
    ].reduce((a, b) => a && b, true);
  });
}

然后您可以执行d: betterAnd('b', 'c', 'notA')