2014-02-21 3 views
0

Javscript:KnockoutJS: Как проходит наблюдение за пользовательской привязкой?

var asdasd = { 
    test: ko.observableArray([0, 50]) 
    }; 

    alert(asdasd.test()); //0,50 

    asdasd.test.subscribe(function() { 
    return alert("I was changed!!"); 
    }); 

    ko.bindingHandlers.rangeslider = { 
    init: function(element, valueAccessor, allBindingsAccessor, viewModel) { 
     var length; 

     length = valueAccessor().length; //0 =(
     return alert("Why valueAccessor().length is " + length + " when it wasn't changed? =(("); 
    } 
    }; 

    ko.applyBindings(asdasd); 

HTML:

<div data-bind="rangeslider: test"></div> 

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

Итак, где это значение потеряно без уведомления об этом?

http://jsfiddle.net/86sAP/3/ - живой пример.

ответ

2

Вы разворачивать valueAccessor, чтобы получить наблюдаемое-й значение:

length = ko.utils.unwrapObservable(valueAccessor()).length; 

Здесь обновляются скрипка: http://jsfiddle.net/86sAP/4/

+0

WAT ... Почему? oO unwrapObservable это просто ko.isObservable (значение)? Значение(): значение. Это только для того, чтобы вы работали над своим объектом, а не с функцией. Но почему это работает? – Vladimirs

+1

Не могу понять, почему ko.utils.unwrapObservable (valueAccessor()) просто работает, но ни valueAccessor, ни valueAccessor() не работает? oO – Vladimirs

+1

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

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