0

我想一旦我看到答案我会感到很愚蠢,但我无法理解为什么or工作但and不在这个问题上ComputedProperty。该教程建议我需要使用and,但如果这不起作用,我不知道该怎么做。

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

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

联系.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 = true
  notNow = false
  isDisabled = false //now

为什么“或”适用于此,为什么“和”或“不”不适用?

4

2 回答 2

1

这就是德摩根定律

您想要的是仅在两个值都有效时才启用按钮。所以你希望按钮在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'),
于 2017-03-04T02:55:43.617 回答
0

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

于 2017-03-03T16:20:24.847 回答