Nano Hash - криптовалюты, майнинг, программирование

Пользовательская привязка Knockout для неопределенного флажка не будет работать

Скажем коротко: это моя нокаутирующая пользовательская привязка для установки флажка в неопределенное состояние.

ko.bindingHandlers.nullableChecked = {
    update: function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        if (value == null) element.indeterminate = true;
        ko.bindingHandlers.checked.update(element, function () { return value; });
    }
};

Если начальное значение равно null, все работает нормально, и флажок устанавливается в неопределенное состояние, но когда я щелкаю флажок, он, похоже, не обновляет значение связанного свойства до false/true соответственно. Я что-то упускаю?


  • Есть ли шанс собрать jsFiddle, чтобы дать нам что-нибудь, с чем можно поиграть? 26.03.2013

Ответы:


1

Вы не вызываете Init.

Просто проксируйте функцию инициализации для проверки в вашей функции инициализации nullableChecked, как вы сделали в обновлении.

ko.bindingHandlers.nullableChecked = {
    init: function(element, valueAccessor) {
          ko.bindingHandlers.checked.init(element, valueAccessor);
    },
    update: function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        if (value == null) element.indeterminate = true;
        ko.bindingHandlers.checked.update(element, valueAccessor);
    }
};

Без инициализации он никогда не устанавливает привязку «щелчок» к флажку, чтобы сообщить нокауту, что что-то изменилось. Если вы посмотрите на отладочный код (http://knockoutjs.com/downloads/knockout-2.2.1.debug.js), вы увидите, что init использует jQuery для настройки события «щелчок» по флажку для обновления наблюдаемого при изменении значения.

ko.bindingHandlers['checked'] = {
'init': function (element, valueAccessor, allBindingsAccessor) {
    var updateHandler = function() {
        var valueToWrite;
        if (element.type == "checkbox") {
            valueToWrite = element.checked;
        } else if ((element.type == "radio") && (element.checked)) {
            valueToWrite = element.value;
        } else {
            return; // "checked" binding only responds to checkboxes and selected radio buttons
        }

        var modelValue = valueAccessor(), unwrappedValue = ko.utils.unwrapObservable(modelValue);
        if ((element.type == "checkbox") && (unwrappedValue instanceof Array)) {
            // For checkboxes bound to an array, we add/remove the checkbox value to that array
            // This works for both observable and non-observable arrays
            var existingEntryIndex = ko.utils.arrayIndexOf(unwrappedValue, element.value);
            if (element.checked && (existingEntryIndex < 0))
                modelValue.push(element.value);
            else if ((!element.checked) && (existingEntryIndex >= 0))
                modelValue.splice(existingEntryIndex, 1);
        } else {
            ko.expressionRewriting.writeValueToProperty(modelValue, allBindingsAccessor, 'checked', valueToWrite, true);
        }
    };
    ko.utils.registerEventHandler(element, "click", updateHandler);

    // IE 6 won't allow radio buttons to be selected unless they have a name
    if ((element.type == "radio") && !element.name)
        ko.bindingHandlers['uniqueName']['init'](element, function() { return true });
},

Изменить: Вот скрипт: http://jsfiddle.net/cclose/NFfVn/< /а>

26.03.2013
  • На самом деле, чтобы включить обновления из кода, обратный вызов обновления в обработчике должен установить неопределенное свойство в false, если значение != null 20.11.2013
  • Кажется, это работает с Knockout ‹= 2.3.0, но не работает с Knockout ›= 3.0.0. Есть идеи, почему? Есть ли решение, которое работает с Knockout 3.0.0? 09.07.2014

  • 2

    Ответ @Fodagus работает с Knockout ‹= 2.3.0, но в Knockout >= 3.0.0 ko.bindingHandlers.checked.update не определено.

    Мы обнаружили, что это работает для нас в Knockout 3.1.0:

        ko.bindingHandlers.nullableChecked = {
            init: function (element, valueAccessor) {
                ko.bindingHandlers.checked.init(element, valueAccessor);
            },
            update: function (element, valueAccessor) {
                var value = ko.utils.unwrapObservable(valueAccessor());
                if (value == null) {
                    element.indeterminate = true;
                }
                else {
                    element.indeterminate = false;
                }
            }
        };
    

    Мы ничего не упускаем?

    09.07.2014


    4

    В новых версиях knockout 3.0.0 и выше. Метод обновления в обработчике привязки checkbox удален. Поэтому вы должны создать click event в функции init, чтобы запускать метод обновления всякий раз, когда нажимается checkbox. Ниже приведен пример обработчика привязки для преобразования jquery checkbox в uniform checkbox.

    ko.bindingHandlers.checkedUniform =
    {
        init: function (element, valueAccessor) {
            ko.bindingHandlers.checked.init(element, valueAccessor);
            $(element).uniform().on('click', ko.bindingHandlers.checkedUniform.update);
        },
        update: function (element, valueAccessor) 
        {
            ko.bindingHandlers.checked.update(element, valueAccessor);
            $.uniform.update($(element));
        }
    };
    
    13.08.2014

    5

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

    ko.bindingHandlers.nullableChecked = {
        update: function (element, valueAccessor) {
            var value = ko.utils.unwrapObservable(valueAccessor());
            if (value == null) element.indeterminate = true;
            ko.bindingHandlers.checked.update(element, valueAccessor);
        }
    };
    
    26.03.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..