Когда использовать ko.utils.распаковывается?


я написал несколько пользовательских Привязок с помощью KnockoutJS. Я все еще не уверен, когда использовать ko.util.unwrapObservable(item) глядя на код, этот вызов в основном проверяет, если item - это наблюдаемое. Если это так, верните значение (), если это не так, просто верните значение. Глядя на раздел о нокауте о создании пользовательских Привязок, они имеют следующий синтаксис:

var value = valueAccessor(), allBindings = allBindingsAccessor();
var valueUnwrapped = ko.utils.unwrapObservable(value);

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

2 108

2 ответа:

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

в коде, который у вас выше, вызов valueAccessor() на самом деле, не разворачивая, наблюдаемой. Это просто получение значения, которое было передано привязке в правильном контексте (он получает завернутый в функцию, чтобы защитить его). Возвращаемое значение valueAccessor() может быть наблюдаемым или нет. Это все, что было передано в переплет.

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

следующие рекурсивно разворачивает все:

ko.utils.unwrapFunction = function (func) {
    if (typeof func != 'function') {
        return func;
    }
    else {
        return ko.utils.unwrapFunction(func());
    }
};

вот пример простой пользовательской привязки, которую я написал:

//replaces single and double 'smart' quotes users commonly paste in from word into textareas and textboxes with normal text equivalents
//USAGE:
//data-bind="replaceWordChars:true
//also works with valueUpdate:'keyup' if you want"

ko.bindingHandlers.replaceWordChars = {
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var bindingValue = ko.utils.unwrapFunction(valueAccessor);

        if (bindingValue) {
            $(element).val(removeMSWordChars(allBindingsAccessor().value())); //update DOM - not sure why I should need to do this, but just updating viewModel doesn't always update DOM correctly for me
            allBindingsAccessor().value($(element).val()); //update viewModel
        }
    }
}

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

надеюсь, что это поможет кому-то.