2015-08-13 7 views
1

Скажем, у меня есть это:Возможно ли запустить обновление привязки, кроме первоначально?

ko.bindingHandlers.test= { 
    update: function (element, valueAccessor) { 
     alert("Test"); 
    } 
}; 

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

+0

Я не уверен, что вы можете - я думаю, что дизайн это происходит изначально для того, чтобы нокаута, чтобы выяснить, что наблюдаемые ваши привязки обработчика зависит от того, чтобы знать, когда называть его будущее. Внутренний нокаут использует довольно умное отслеживание, чтобы знать, какие наблюдаемые зависят друг от друга, поэтому он не постоянно запускает много кода, который ему не нужен. Возможно, я ошибаюсь, и может быть способ остановить его от запуска обновления изначально, поэтому это комментарий, а не ответ ... –

+1

Просто перечитайте [документы] (http://knockoutjs.com /documentation/custom-bindings.html), среди прочего, это говорит об «обновлении»: _ «Это будет вызываться один раз, когда привязка сначала применяется к элементу« _ », поэтому любой способ обойти это - это борьба с предполагаемое использование нокаута, а не работа с ним. –

+0

Это потенциально проблема [XY Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) - можете ли вы объяснить, почему вы хотите избежать запуска 'update' изначально? –

ответ

0

Как я могу предупредить огонь о каждом изменении, кроме как изначально?

Knockout будет вызывать обратный вызов обновления первоначально, когда привязка применяется к элементу и отслеживать любую зависимость (наблюдаемый/computeds), доступ к которому. Когда какая-либо из этих зависимостей изменится, обратный вызов обновления будет вызван еще раз.

Я не думаю, что можно запускать только изменения, а не изначально.

Вы можете создать обходной путь, соответствующий вашему сценарию, добавив событие изменения, связанное с вашим элементом внутри init.

init: function(element, valueAccessor) { 
    // element should be the element you want to attach change event. 
    $(element).on('change', function (value) 
    { 
     // do your stuff. 
    }); 
} 
+0

Эта функция обрабатывается, когда значение _element_ изменяется, а не когда изменяется наблюдаемая/потенциально сложная цепочка наблюдаемых, назначенная обработчику привязки. Скорее всего, вы, вероятно, захотите сделать то, что вы предлагаете, так что вы можете вносить любые изменения в элемент обратно в наблюдаемый. –

1

Вот один из способов: сохранить массив элементов, которые update заполняющий с элементом, если он не существует (это первый раз, когда он работает) и в противном же как и любое действие. Поскольку у вас есть настраиваемый обработчик привязки, вы можете просто отключить этот массив.

ko.bindingHandlers.test = { 
 
    update: function(element, valueAccessor) { 
 
    var seenElements = ko.bindingHandlers.test.seen, 
 
     val = valueAccessor()(); 
 
    if (seenElements.indexOf(element) >= 0) { 
 
     alert("Test"); 
 
    } else { 
 
     seenElements.push(element); 
 
    } 
 
    } 
 
}; 
 
ko.bindingHandlers.test.seen = []; 
 

 
var vm = { 
 
    alertOn: ko.observable(0), 
 
    raiseAlert: function() { 
 
    vm.alertOn.notifySubscribers(); 
 
    } 
 
}; 
 
ko.applyBindings(vm);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
<div data-bind="test:alertOn"></div> 
 
<button data-bind="click:raiseAlert">Update</button>

Смежные вопросы