Почему срабатывает моя пользовательская привязка KnockoutJS?

У меня странная ситуация. В основном, у меня есть две пользовательские привязки, которые используются для анимации элемента 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, что и большая часть пользовательской привязки, приведет к ее обновлению!

http://jsfiddle.net/J6EPx/2/

Хммм... похоже, мне придется обходить это, вручную проверяя в моей пользовательской привязке, действительно ли значение изменилось или нет!!! Не противоречит ли это сути привязки????

Я также разместил более точный вопрос на форумах Knockout: http://groups.google.com/group/knockoutjs/browse_thread/thread/d2290d96e33f1d5a

6
задан Pedro del Sol 17 March 2017 в 15:33
поделиться