Обновление зависимостей записываемых вычисляемых наблюдаемых

Я пытаюсь использовать вычисляемые obockables knockout.js для настройки C#-подобных свойств модели. Я хочу, чтобы наблюдаемые принимали только допустимые значения. Упрощенный пример:

function Model()
{
    var a = 100;
    var b = 200;

    var $ = this;
    this.a = ko.computed({
        read: function(){return a},
        write: function(value){
            var newval = parseFloat(value, 10);
            if(newval < 1000) 
                a = newval;
        }});

    this.b = ko.observable(b);
}

Запись в a hover не обновляет привязки. Можно ли включить изменение a как будто это был постоянный член Model но с дополнительной функциональностью?

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

1 ответ

Решение

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

Вместо этого вы можете использовать расширители для достижения этой цели. Вот скрипка с демо.

ko.extenders.maxNumber = function(target, option) {
    var result = ko.computed({
        read: target,
        write: function(value){
            var newval = parseFloat(value, 10);
            if (newval < option) {
                target(newval);
            } else {
                alert('Number is to big');
            }
        }
    });

    result(target());

    return result;
};

function Model() {
    var a = 100;
    this.a = ko.observable(a).extend({ maxNumber: 1000 });
}
Другие вопросы по тегам