Рассмотрим это:
var A = 1;
var originalA = A;
A = 2;
Таким образом, каждое место, где Использовали имеет новое значение, и мы все еще можем использовать старую. Поскольку в JavaScript функция является объектом, вы можете сделать то же самое для нее. Сохраните старый и перезапишите его с помощью некоторых новых функций.
var functionA = function() {};
var originalFunctionA = functionA;
functionA = function() {};
Он не создает цикл, потому что он больше не имеет такой же ссылки. Старая ссылка перезаписывается новой функцией. Прекрасный пример в вашем вопросе. У нас есть библиотека knockout
по методу binding
. Чтобы расширить его, мы можем изменить исходный исходный код библиотеки, но тогда нам придется делать это каждый раз, когда обновляется библиотека. Чем больше таких изменений нам потребуется, тем сложнее будет поддерживать.
Таким образом, мы пишем новую функцию привязки в месте оригинальной. Приятно, но теперь, если мы не хотим полностью изменить его и просто продлить его, нам нужно написать все, что он сделал в первую очередь. Зачем писать его снова, когда он уже написан? Мы копируем исходную функцию в какой-то новой справки:
var originalBindingInit = ko.bindingHandlers.binding.init;
var originalBindingUpdate = ko.bindingHandlers.binding.update;
, а затем вызвать его, когда нам это нужно делать свою работу:
var bindingInit = function() {
// do sth befeore
originalBindingInit(someVariable);
// do sth after
}
Мы можем поместить наше расширение в начале для некоторых переменных препаратов и затем вызвать оригинальную функцию, чтобы делать то, что он всегда делает:
var someRoundedVariable = Math.round(someVariable);
originalBindingInit(someRoundedVariable);
в Knockout JS есть другой способ сделать это, написав пользовательские связывания обработчика. И чем назвать оригинал.
ko.bindingHandlers.verifyValue = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
// do sth to verify value and than call other binding:
ko.bindingHandlers.value.init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
},
update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
// The rest of this binding is handled by the default value binding. Pass it on!
ko.bindingHandlers.value.update(element, newValueAccessor, allBindingsAccessor, viewModel, bindingContext);
}
};
У обоих есть недостатки и плюсы. Иногда вы не можете изменять View и иметь доступ только к ViewModel, иногда вы уверены, что вам не нужна оригинальная привязка без расширений (или если это опасно), в другое время, когда вам нужно изменить привязку в нескольких местах, а не во всех из них, а затем лучше создать новую привязку.
Мне кажется, что кто-то перезаписывает существующее пользовательское связующее, называемое 'binding ', но сохраняет оригинальное в такте, чтобы вызвать новый. Посмотрите, не привязано ли их к оригинальной привязке до установки –