Выполнить неверную проверенную привязку на нокауте js?

У меня есть флажок типа ввода в нокауте js, и я хочу выполнить действие «не верно», когда этот флажок установлен. Что-то вроде этого:

<input type="checkbox" data-bind="checked: !IsVisible"/> 

Но это не работает. Я знаю, что могу вызвать IsHidden и установить общую проверенную привязку, но у меня есть особая ситуация, в которой мне нужно такое поведение.


person Phoenix_uy    schedule 03.05.2013    source источник
comment
В качестве интересного упражнения я разместил вопрос с вопросами и ответами, который демонстрирует общую непривязку, которая позволяет вам писать html следующим образом: <input type="checkbox" data-bind="not: {checked: isVisible}" /> (stackoverflow .com/q/16368784/91189)   -  person Joseph Gabriel    schedule 04.05.2013


Ответы (3)


Вы можете оценить наблюдаемое прямо в привязке, и ваша идея должна сработать.

вот так: <input type="checkbox" data-bind="checked: !IsVisible()"/>

Однако обратите внимание, что при этом теряется «наблюдаемость», что, вероятно, не то, что вам нужно.

Альтернативой является создание свойства IsHidden, которое вычисляется на основе IsVisible.

var ViewModel = function (model) {
    var self = this;
    self.IsVisible = ko.observable(model.IsVisible);
    self.IsHidden = ko.computed({
        read: function () {
            return !self.IsVisible();
        },
        write: function (newValue) {
            self.IsVisible(!newValue);
        }
    });
}

Скрипка

person Joseph Gabriel    schedule 03.05.2013
comment
Точно, я не хочу терять эту наблюдаемость - person Phoenix_uy; 03.05.2013

Определите пользовательскую привязку. См. "Упрощение и очистка представлений в KnockoutJS", в котором раздел очень, очень похож на то, что вы просите. В принципе, что-то вроде этого должно работать (ПРИМЕЧАНИЕ: не проверено):

ko.bindingHandlers.notChecked = {
  update: function(element, valueAccessor) {
    var value = ko.utils.unwrapObservable(valueAccessor());
    ko.bindingHandlers.checked.update(element, function() { return!value; });
  }
};

Тогда вы можете сделать:

data-bind="notChecked: IsVisible"
person PatrickSteele    schedule 03.05.2013

Это потому что с! вы выполняете функцию на наблюдаемом. Использовать это:

<input type="checkbox" data-bind="checked: !IsVisible()"/> 
person Chris Dixon    schedule 03.05.2013
comment
Ааа, просто прочитайте предыдущий ответ, в котором говорится именно об этом. - person Chris Dixon; 03.05.2013