2014-04-18 102 views
2

我有這個旋鈕。用旋轉工具旋轉成麻煩

當設置它是確定,控制顯示正確的價值,沒有錯誤消息,但如果我改變它,我每次收到此錯誤信息:

「類型錯誤:可觀察到的是不是一個函數」

在這一行:

observable($(element).spinner("value")); 

這是我的自定義線結合,這是這樣的:

ko.bindingHandlers.spinner = { 
    init: function (element, valueAccessor, allBindingsAccessor) { 
    //initialize datepicker with some optional options 
    var options = allBindingsAccessor().spinnerOptions || {}; 


    $(element).spinner(options); 

    //handle the field changing 
    ko.utils.registerEventHandler(element, "spinchange", function() { 
     //var observable = valueAccessor(); 
     var observable = ko.utils.unwrapObservable(valueAccessor()); 
     observable($(element).spinner("value")); 
    }); 

    //handle disposal (if KO removes by the template binding) 
    ko.utils.domNodeDisposal.addDisposeCallback(element, function() { 
     $(element).spinner("destroy"); 
    }); 

    }, 
    update: function (element, valueAccessor) { 
    var value = ko.utils.unwrapObservable(valueAccessor()), 
     current = $(element).spinner("value"); 

    if (value !== current) { 
     $(element).spinner("value", value); 
    } 
    } 
}; 

如果我換失敗與被註釋掉一個行:

var observable = valueAccessor(); 

它工作正常。 爲什麼第一個失敗?

回答

3

在一個自定義綁定中,valueAccessor是一個function,它返回綁定的值,所以你在綁定的「右側」有什麼。

因此,在data-bind="spinner: yourValue的情況下,您將獲得yourValue財產的內容。

如果您yourValueko.observable然後var observable = valueAccessor();observable將包含來自yourValue實際觀察到的功能你現在可以將其設置爲任意值:

var observable = valueAccessor(); 
observable($(element).spinner("value")); 

因此,這是在這個正確的用法因爲你需要引用和使用你的可觀察函數而不是它的值。

但是,如果你使用ko.utils.unwrapObservable(valueAccessor());那麼它會自動解開你的觀測值,所以你會以一個不是函數的值結束。所以這個調用大致相當於寫valueAccessor()();

所以,如果您的視圖模型是這樣的:

vm = { 
    yourValue: ko.observable(5); 
} 

當你寫:

var observable = ko.utils.unwrapObservable(valueAccessor()); 
observable($(element).spinner("value")); 

observable將包含值5而不是功能所以你會得到上述例外。