Пользовательская привязка не будет обновляться, когда проанализированный номер равен текущему - PullRequest
0 голосов
/ 09 мая 2018

Привязка нокаута не будет обновлять ввод при вводе числа с плавающей запятой, которое анализируется в целое число, которое уже введено / проанализировано.

Изменение ввода на другой номер или очистка ввода работает. Но мне нужно, чтобы он работал на все номера.

Вся помощь очень ценится

Я пробовал также пытался

.extend({notify: 'always'})

без удачи

т.

первый ввод: 11.11 -> 11

второй вход: 11,20 -> 11,20

Переплет:

ko.bindingHandlers.integer = {
        init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
            var maxInt = 2147483647;

            var bindings = allBindingsAccessor();

            var valueUpdate = bindings.valueUpdate;
            var defaultValue = null;
            var observable;
            var accessor = (bindings == undefined ? valueAccessor() : bindings.integer);


            if (typeof (accessor) != "function" && typeof (accessor) != "number") {
                observable = accessor.value;
                defaultValue = accessor.default;
                maxInt = accessor.maxValue != null ? accessor.maxValue : maxInt;
            } else {
                observable = accessor;
            }
            var interceptor = ko.computed({
                read: function () {
                    var value = ko.isObservable(observable) ? observable() : observable;
                    if (value === null || value === undefined) return defaultValue;

                    return BindingHelpers.formatWithThousandSeparators(value);
                },
                write: function (newValue) {
                    newValue = newValue.replace(/\s/g, '');
                    var v = BindingHelpers.reverseFormat(newValue, defaultValue);
                    v = (v*1).toFixed(0);

                    if (v > maxInt)
                        v = maxInt;
                    observable(v);
                }

            });

            if (element.tagName === 'INPUT')
                ko.applyBindingsToNode(element, {
                    value: interceptor,
                    valueUpdate: valueUpdate
                });
            else
                ko.applyBindingsToNode(element, {
                    text: interceptor
                });
        }
    };

ViewModel:

self.addEnergy= function () {
    self.energy.push({
        Source: ko.observable(""),
        Target: ko.observable(""),
        Effect: ko.observable(0)               
            .extend({ max: { params: 1500, message: '' } })
            .extend({ min: { params: 1, message: ''} }),
        Id: ko.observable(""),
        Enabled: ko.observable(true)

    });
};

Html

//Code emited

<td class="text-center has-feedback" data-bind="css: {'has-error': !Effect.isValid()}">
<input type="text" class="edit form-control text-right" data-bind="integer: Effect, visible: Enabled" />
<label class="read" data-bind="integer: Effect, visible: !Enabled()"></label>
</td>

1 Ответ

0 голосов
/ 09 мая 2018

Попробуйте добавить interceptor.notifySubscribers(); в конец функции записи.

var interceptor = ko.computed({   
    read: function () {
        var value = ko.isObservable(observable) ? observable() : observable;
        if (value === null || value === undefined) return defaultValue;

        return BindingHelpers.formatWithThousandSeparators(value);
    },
    write: function (newValue) {
        newValue = newValue.replace(/\s/g, '');
        var v = BindingHelpers.reverseFormat(newValue, defaultValue);
        v = (v*1).toFixed(0);

        if (v > maxInt)
            v = maxInt;
        observable(v);
        interceptor.notifySubscribers(); //<-- notifies the UI to update even if the value hasn't changed
    }
});
...