Логический оператор ||как-то не дает желаемого результата - PullRequest
1 голос
/ 24 сентября 2019

У меня есть эта переменная, которая переключается, если некоторые вещи разрешены для редактирования или не выглядят так

enabled: !(parseInt("@Model.Status") === @((int)Status.Active) ||
!(parseInt("@Model.Status") === @((int)Status.Expired)) && '@Model.EditMode' === 'True'),

По какой-то причине, если это работает для тех, которые имеют статус active, а не expiredи если я переверну его и поставлю сначала expired, то это будет работать для expired, но не для active единиц ... Так что я ошибаюсь, кто-то подумал, что если статус либо Expired, либо Activeвключенный должен быть ложным, чтобы его нельзя было редактировать, все остальные статусы должны быть в порядке.

Я также пытался написать это так, заключив в скобки второе утверждение

!((parseInt("@Model.Status") === @((int)Status.Expired))

и, как это, перевернул оператор if, но ни один из них не решил

 (parseInt("@Model.Status") !== @((int)Status.Expired)

Отличный комментарий от Pointy!но, к сожалению, это не проблема здесь, потому что даже если я пропущу весь оператор &&, у меня все еще будет та же проблема только с

 !(parseInt("@Model.Status") === @((int)Status.Active) || !(parseInt("@Model.Status") === @((int)Status.Expired)))

, это все равно создает ту же проблему

1 Ответ

2 голосов
/ 24 сентября 2019

Ваше состояние, кажется, неправильно.!(parseInt("@Model.Status") === @((int)Status.Active) || !(parseInt("@Model.Status") === @((int)Status.Expired)) && '@Model.EditMode' === 'True')

можно рассматривать как !(a || !(b) && c), где

a = parseInt("@Model.Status") === @((int)Status.Active)
b = parseInt("@Model.Status") === @((int)Status.Expired)
c = '@Model.EditMode' === 'True'

Оператор AND (&&) имеет более высокий приоритет, чем ||, поэтому может отображаться фактический порядок оценкииспользуя группировку как !(a || (!(b) && c)) так же, как 2 + 3 * 4 оценивается как 2 + (3 * 4).

Однако представленная логика не соответствует требованию.Статус должен быть любым, кроме Активного или Истекшего и Режим редактирования должен иметь значение «Истина».Однако, похоже, что скобки не совпадают, вероятно, из-за опечатки, так как логическое выражение whole отрицается, и, кроме того, второе условие также отрицается, тогда как это не должно быть.

Правильное логическое выражение !(a || b) && c.Подставляя логические тесты:

!(parseInt("@Model.Status") === @((int)Status.Active) || parseInt("@Model.Status") === @((int)Status.Expired) &&
  '@Model.EditMode' === 'True'

Я не знаком с Kendo, но если возможно использовать !==, то выражение можно немного упростить, сняв некоторые скобки.Согласно законам Де Моргана !(a || b) эквивалентно !a && !b, поэтому, если мы выполним эту замену, мы получим !a && !b && c.Если мы также изменим с !(parseInt("@Model.Status") === @((int)Status.Active)) на parseInt("@Model.Status") !== @((int)Status.Active), то получим:

parseInt("@Model.Status") !== @((int)Status.Active) && 
  parseInt("@Model.Status") !== @((int)Status.Expired) && 
  '@Model.EditMode' === 'True'
...