Вопрос

У меня странная ситуация. По сути, у меня есть две пользовательские привязки, которые используются для оживления элемента 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://jsfiddle.net/j6epx/2/

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

Я также опубликовал более точный вопрос на форумах нокаутов: 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
        });
    }
};

http://jsfiddle.net/rniemeyer/ukufy/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top