Почему запускается моя нестандартная привязка?
-
26-10-2019 - |
Вопрос
У меня странная ситуация. По сути, у меня есть две пользовательские привязки, которые используются для оживления элемента DOM до его новой ценности. Это Awidth и Aright, которые оживляют ширину и правильные значения соответственно.
Я реализовал такие привязки:
<div class='classname' data-bind="aRight: right, aWidth: containerWidth, style: { zIndex: zindex, left: (left() + 'px'), height: (containerHeight() + 'px') }">
... и индивидуальные привязки выглядят так:
ko.bindingHandlers.aWidth =
{
update: function (element, valueAccessor, allBindingsAccessor, context)
{
// Get the value accessor
var value = valueAccessor();
// Get the new width and the duration of the animation
var newWidth = ko.utils.unwrapObservable(value);
var duration = 500;
$(element).animate({ width: newWidth }, duration, "swing");
}
};
ko.bindingHandlers.aRight =
{
update: function (element, valueAccessor, allBindingsAccessor, context)
{
// Get the value accessor
var value = valueAccessor();
// Get the new width and the duration of the animation
var newRight = ko.utils.unwrapObservable(value);
var duration = 500;
$(element).animate({ right: newRight }, duration, "swing");
console.log("aRight Called: newRight - " + newRight + ", duration - " + duration);
}
};
Таким образом, проблема возникает, когда мы меняем наблюдаемый, кроме двух моих пользовательских наблюдаемых наблюдаемых, например, Zindex.
Если мы изменим наблюдаемый ZINDEX, значение правильно обновляется в DOM, но по какой -то причине мое привязку также запускается! ...
У меня нет никаких ссылок на это в моем привязанном привязке, так что, безусловно, не может быть зависимостью?
Мое привязку также запускается, когда мое привязка Awidth также запускается, что также немного странно!
У кого -нибудь есть идеи по этому поводу?
Большое спасибо!
Энди.
Обновлять
Это та часть модели представления, которая обновляет индекс, который, когда приводит мое правильное привязку к огню (кстати, это очень много псудо-код!):
var page = function()
{
this.zindex = ko.observable(0);
this.right = ko.observable(0);
// and other observables....
}
var viewModel = function()
{
var pages = ko.oberservableArray();
// populate the pages array etc...
this.someMethod = function()
{
// Do some stuff...
this.anotherMethod();
// Do some other stuff
}
.bind(this);
this.anotherMethod() = function
{
var pageCount = this.pages().length;
for (var pageNum = 0; pageNum < pageCount; pageNum++)
{
var page = this.pages()[pageNum];
page.zindex(/* a different value */); // This is what causes my aRight binding to fire...
}
}
.bind(this);
}
Обновлять
Я только что прочитал пост здесь: http://groups.google.com/group/knockoutjs/browse_thread/thread/26a3157ae68c7aa5/44c96d1b748f63bb?lnk=gst&q=custom+binding+firing#44c96d1b748f63bb
Сказание:
Кроме того, привязка будет снова запустить функцию обновления, если также запускается другая привязка в одном и том же атрибуте связывания данных.
Означает ли это, что я вижу, что мое пользовательское привязку запускается, когда какая-либо другая привязка атрибута в области связей в данных запускается (так бывает так, что, может быть, Zindex-это первый, который я вижу в изменении)? Это не немного странно/неправильно? ...
Обновлять
У меня есть простая скрипка, которая, я думаю, в значительной степени подводит итог моей проблемы. Похоже, что любая привязка на том же атрибуте связывания данных, как и много пользовательского привязки, приведет к обновлению!
Хммм ... Думаю, мне придется обойти его, проверяя вручную в моей индивидуальной привязке относительно того, действительно ли значение изменилось или нет !! Разве это не побеждает эту фактическую точку привязки ???
Я также опубликовал более точный вопрос на форумах нокаутов: http://groups.google.com/group/knockoutjs/browse_thread/thread/d2290d96e33f1d5a
Решение
Это в настоящее время по дизайну. Все привязки в связке данных запускаются при стрельбе из привязки. Это потому, что все они обернуты в один зависимость. В некоторых случаях привязки имеют зависимость между собой (если опции обновляются, то значение необходимо работать, чтобы убедиться, что это все еще является допустимым значением). Однако в некоторых случаях это вызывает проблему.
Существует другой шаблон, который вы можете использовать при создании пользовательского привязки, которая помогает смягчить это поведение. Вместо того, чтобы определять кишки вашей функциональности в функции «Обновление», вы на самом деле создадите свой собственный зависимость в функции «init». Это было бы похоже:
ko.bindingHandlers.custBinding= {
init: function(element, valueAccessor) {
ko.dependentObservable({
read: function() {
ko.utils.unwrapObservable(valueAccessor());
alert("custBinding triggered");
},
disposeWhenNodeIsRemoved: element
});
}
};