为什么 "or" 有效但 "and" 不在我的 Ember.ComputedProperty 中?

Why is "or" working but "and" is not in my Ember.ComputedProperty?

我想一旦我看到答案我会觉得自己很愚蠢,但我无法理解为什么 or 有效但 and 不在这个 ComputedProperty.教程建议我需要使用 and,但如果这不起作用,我不知道该怎么做。

首先,我是 Ember 的新手,熟悉但不太熟悉 javascript,这就是为什么我认为我很难理解这里发生的事情。

我有两个属性需要在按钮 isDisabled 之前都为 true。我将它们中的每一个都传递给它们自己的属性,这些属性会反转它们的布尔状态,因此 isDisabled 在按钮上保持活动状态,直到原始属性都被翻转。

contact.js

emailAddress: '',
  message: '',

  //**original properties**
  isValid: Ember.computed.match('emailAddress', /^.+@.+\..+$/),//starts as false
  validMessage: Ember.computed.gte('message.length', 5),//starts as false

  //**my reversing boolean properties**
  notYet: Ember.computed.not('isValid'),//starts as true
  notNow: Ember.computed.not('validMessage'),//starts as true


//isDisabled must be true to be active disabling button
  isDisabled: Ember.computed.or('notYet', 'notNow'),//starts as true

如果我输入正确的电子邮件地址格式:

emailAddress = true
notYet = false
isDisabled = true //still

如果我然后输入 5 个字符或更多的 validMessage

  validMessage = true
  notNow = false
  isDisabled = false //now

为什么 "or" 对此有效,为什么 "and" 或 "not" 无效?

我不太确定我是否正确理解你的问题;但据我了解,只有当您的原始值(isValidvalidMessage)都为真时,您才希望 isDisabled 为真。您需要做的是 "AND these two properties" 或“不是每个值的 NOT 的或运算结果”。您可以看到我准备的 twiddle 并查看与计算相关的所有内容(ANDing、NOTing 等) properties 正在按预期工作。希望这对您有所帮助。

这就是 德摩根定律

你想要的是仅当两个值都有效时才启用按钮。所以你希望按钮在 isValid and validMessage.

时处于活动状态

这意味着您希望在 not(isValid and validMessage) 时禁用按钮。

根据德摩根定律,这等同于 (not isValid) or (not validMessage)

因为 notYet 等于 not isValid 所以 (not isValid) or (not validMessage) 等于 notYet or (not validMessage).

并且因为 notNow 等于 not validMessage 因此 notYet or (not validMessage) 等于 notYet or notNow.

那正是你的 isDisabled。这就是您的代码有效的原因。只是简单的数学。当然,在这种情况下 notYet or notNow 会是另外一回事。然而,这将是等价的:

isEnabled: Ember.computed.and('isValid', 'validMessage'),
isDisabled: Ember.computed.not('isEnabled'),