2013-09-03 3 views
1

Я не понимаю логику следующего и надеюсь, что кто-то поможет мне понять. Я очищаю веб-приложение и обнаружил следующие строки кода. Приложение представляет собой приложение MVC с использованием Knockout.js. Есть несколько пользовательских привязки установки со следующей структурой:Knockout.js custom binding design

var originalBindingInit = ko.bindingHandlers.binding.init; 
var originalBindingUpdate = ko.bindingHandlers.binding.update; 

ko.bindingHandlers.binding = { 
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
     originalBindingInit(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext); 

     // Init code here... 
    }, 

    update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
     originalBindingUpdate(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext); 

     // Update code here... 
    } 
}; 

Я не понимаю, почему обновление инициализации & Создается переменными вне привязки, а затем открыл огнь по первой строке каждой секции связывания? Мне кажется, что вы создаете цикл, делая это.

Может кто-нибудь пролить некоторый свет на это? Если он включен в документацию для нокаута, я пропустил его и для этого я извиняюсь.

+1

Мне кажется, что кто-то перезаписывает существующее пользовательское связующее, называемое 'binding ', но сохраняет оригинальное в такте, чтобы вызвать новый. Посмотрите, не привязано ли их к оригинальной привязке до установки –

ответ

1

Рассмотрим это:

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, иногда вы уверены, что вам не нужна оригинальная привязка без расширений (или если это опасно), в другое время, когда вам нужно изменить привязку в нескольких местах, а не во всех из них, а затем лучше создать новую привязку.