2014-04-10 18 views
0

目前下列日期選擇器結合的非可觀察value.When完美的工作在那裏我已經更新了淘汰賽3.0它不工作ko.bindingHandlers.datepicker不是淘汰賽版本3.0中

ko.bindingHandlers.datepicker = { 
    init: function(element, valueAccessor, allBindingsAccessor) { 
     // Get the options from the binding. 
     var options = allBindingsAccessor().datepickerOptions || {}; 

     $(element) 
     .datepicker(options) 
     .bind("change", function() { 
      ko.bindingHandlers.datepicker.updateValue(element, valueAccessor, allBindingsAccessor); 
     }); 

     ko.utils.domNodeDisposal.addDisposeCallback(element, function() { 
      $(element).datepicker("destroy"); 
     }); 
    }, 
    update: function(element, valueAccessor, allBindingsAccessor) { 
     var value = ko.utils.unwrapObservable(valueAccessor()); 

     // If the date is coming from a Microsoft webservice. 
     if (typeof value === "string" && value.indexOf('/Date(') === 0) { 
      value = new Date(parseInt(value.replace(/\/Date\((.*?)\)\//gi, "$1"))); 
     } 
     var currentDate = $(element).datepicker("getDate"); 

     // Check if the date has changed. 
     if (value && value - currentDate !== 0) { 
      $(element).datepicker("setDate", value); 
     } 
    }, 
    updateValue: function(element, valueAccessor, allBindingsAccessor) { 
     var observable = valueAccessor(), 
     dateValue = $(element).datepicker("getDate"); 

     // Two-way-binding means a writeable observable. 
     if (ko.isWriteableObservable(observable)) { 
      observable(dateValue); 
      return; 
     } 
     if (allBindingsAccessor()._ko_property_writers) { 
      allBindingsAccessor()._ko_property_writers.datepicker(dateValue); 
     } 
    } 
}; 

我使用淘汰賽2.1.0當我調試代碼,我才知道這是allBindingsAccessor()._ko_property_writers是未定義的。因爲我不能更新nonobservable值。

JsFIddle

有人建議我在3.0版本

上面代碼的解決方案通過使用下面的例子我已經修改了我的自定義綁定,它是偉大的工作。請找到更新的小提琴

Updated Fiddle

回答

1

問題是_ko_property_writers是一個私有實現細節(這就是爲什麼名稱前綴爲_)。如果你讀line 188-195 in the source code for expression rewriting in knockout你會看到,它規定如下:

使綁定顯式聲明自己是「雙向」是不是在長期(它會更好,如果所有綁定可以使用一個官方的理想'property writer'API,而不需要聲明他們可能)。但是,由於這不是公開的API(_ko_property_writers從來沒有記錄),因此它在短期內作爲內部實現細節是可以接受的。

對於那些在自定義綁定中依賴_ko_property_writers的開發者,我們將_twoWayBindings作爲一個未公開的特性公開,這使得升級到KO 3.0相對容易。但是,這仍然不是官方的公共API,如果我們創建了真正的公共屬性編寫器API,我們保留隨時刪除它的權利。

因此,似乎仍然沒有公共API不會改變爲將來的版本,但您應該能夠使用_twoWayBindings,直到這樣的API被決定並提供。

已更新2014年4月15日 - 添加設置雙向綁定標誌

_twoWayBindings設置(可能在淘汰賽中的任何未來版本中消失的樣本,因爲它不是一個真正的公共API,不幸)是一個國旗,您可以在創建bindingHandler時告訴淘汰賽爲您的bindingHandler創建_ko_property_writers條目。您設置該標誌的方式類似於您如何創建一個新的bindingHandler:

ko.expressionRewriting._twoWayBindings['simpleTwoWayBinding'] = true; 

綁定的一個完整的例子會做雙向綁定不可觀察的性質:

ko.expressionRewriting._twoWayBindings['simpleTwoWayBinding'] = true; 
ko.bindingHandlers['simpleTwoWayBinding'] = { 
    init: function(element, valueAccessor, allBindings, viewModel){ 
     element.value = valueAccessor(); 
     var valueSetter = allBindings.get('_ko_property_writers').simpleTwoWayBinding; 
     element.addEventListener('change', function(){ 
      valueSetter(element.value); 
     }); 
    } 
}; 

我有一個工作樣本,你可以在http://jsfiddle.net/p8ugz/

但是,請注意上面的代碼不能使用可觀察的屬性。爲了支持這兩種情況,你需要檢查它是否綁定到可觀察對象,並且在這種情況下只使用普通的可觀察對象,如果它不是可觀察對象,則使用_ko_property_writers

+0

我試過_twowaybindings ..但它不工作 – MaheshMajeti

+0

如果你可以請編輯你的問題,並添加一個[最小示例](http://stackoverflow.com/help/mcve)並用最小的例子來描述問題,我會看看,看看我是否可以得到最小的例子工作。 –

+0

我已經創建了js小提琴..關於我的問題 – MaheshMajeti