Когда использовать ko.utils.распаковывается?
я написал несколько пользовательских Привязок с помощью KnockoutJS. Я все еще не уверен, когда использовать ko.util.unwrapObservable(item)
глядя на код, этот вызов в основном проверяет, если item
- это наблюдаемое. Если это так, верните значение (), если это не так, просто верните значение. Глядя на раздел о нокауте о создании пользовательских Привязок, они имеют следующий синтаксис:
var value = valueAccessor(), allBindings = allBindingsAccessor();
var valueUnwrapped = ko.utils.unwrapObservable(value);
в этом случае, они вызывают наблюдаемые через ()
но тогда и называть ko.utils.unwrapObservable
. Я просто пытаюсь взять себя в руки когда использовать один против другого или если я должен просто всегда следовать приведенной выше схеме и использовать оба.
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 всегда содержит значение. Мне не нужно беспокоиться о том, если я передал функцию, наблюдаемую, значение или даже функцию внутри наблюдаемой. Это будет правильно разворачивать все, пока он не доберется до объекта, который я хочу.
надеюсь, что это поможет кому-то.