Почему отрицание значения привязки в knockoutjs должно быть развернуто

Я заметил, что в KnockoutJS привязка значения не работает, если она отрицается:

так:

data-bind="showTip: enableTip, css: { disabled: !addButtonEnabled }"

неправильно считывает отрицательную переменную addButtonEnabled.

Однако это работает:

data-bind="showTip: enableTip, css: { disabled: !addButtonEnabled() }"

Почему он должен быть развернут, а другой нет?

Я использую нокаут 1.2.1.

Ответ 1

Позвольте мне немного пояснить, как KO разборяет привязки в вашем примере.

Фактически привязка данных содержит JSON. KO обертывает его символами {} и оценивает как обычный JS-код. В вашем примере KO получил этот объект после оценки:

{
    showTip: enableTip,
    css: { disabled: !addButtonEnabled }
}

css bindingHandler получает привязку node, которая должна быть применена к функции bindingAccessor.

После оценки этой функции мы получаем "аргумент" для привязки css. который равен объекту

{ disabled: !addButtonEnabled }

Затем css bindingHandler выполняет итерации через свойства этого объекта для установки соответствующих стилей. Когда дело доходит до свойства disabled, нам нужно прочитать значение для него.

Обычно все стандартные привязки считывают значение таким образом: ko.utils.unwrapObservable(value), который возвращает value, если value не наблюдается или значение сохраняется в этой наблюдаемой переменной.

В вашем случае value = !addButtonEnabled. Как вы можете видеть, !addButtonEnabled - это выражение JavaScript, не наблюдаемое. Поэтому он просто оценивает это выражение. Таким образом, на самом деле ваша кнопка всегда включена с observable() != false.

В вашем втором случае оцениваемое значение содержит значение наблюдаемого, поэтому оно работает правильно.

Я думаю, вы