Ответ 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
.
В вашем втором случае оцениваемое значение содержит значение наблюдаемого, поэтому оно работает правильно.
Я думаю, вы