У меня странная ситуация. В основном, у меня есть две пользовательские привязки, которые используются для анимации элемента DOM к его новому значению. Это aWidth и aRight, которые анимируют значения ширины и права соответственно.
Я реализовал привязки следующим образом:
... и пользовательские привязки выглядят следующим образом:
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, но по какой-то причине моя привязка aRight также срабатывает!...
У меня нет никаких ссылок на него в пользовательской привязке aRight, так что зависимости быть не может?
Моя привязка aRight также срабатывает, когда срабатывает привязка aWidth, что тоже немного странно!
Есть ли у кого-нибудь идеи по этому поводу?
Большое спасибо!
Энди.
Update
Это часть модели представления, которая обновляет индекс, что вызывает срабатывание моей пользовательской привязки aRight (кстати, это очень много psudo-кода!):
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);
}
Update
Я только что прочитал сообщение здесь: http://groups.google.com/group/knockoutjs/browse_thread/thread/26a3157ae68c7aa5/44c96d1b748f63bb?lnk=gst&q=custom+binding+firing#44c96d1b748f63bb
Там говорится:
Кроме того, привязка будет иметь свою функцию обновления, если
другая привязка в том же атрибуте data-bind также будет запущена.
Означает ли это, что моя пользовательская привязка срабатывает, когда срабатывает любая другая привязка в атрибуте data-bind (просто так получилось, что первым изменился zindex)? Не является ли это немного странным/неправильным?...
Обновление
У меня есть простой фиддл, который, как мне кажется, очень точно описывает мою проблему. Похоже, что любая привязка к тому же атрибуту data-bind, что и большая часть пользовательской привязки, приведет к ее обновлению!
Хммм... похоже, мне придется обходить это, вручную проверяя в моей пользовательской привязке, действительно ли значение изменилось или нет!!! Не противоречит ли это сути привязки????
Я также разместил более точный вопрос на форумах Knockout: http://groups.google.com/group/knockoutjs/browse_thread/thread/d2290d96e33f1d5a
6
задан Pedro del Sol 17 March 2017 в 15:33
поделиться