2012-08-06 49 views
4

我想我可以很容易地與jQuery UI的日曆和knockout.js感謝的日期數據綁定到this answer.淘汰賽JS用的DateTimePicker綁定給出了一個例外

現在我需要綁定一個日期數據以及它的時間。當然,我可以使用timepicker。但我不確定我如何將它的數據與knockout.js綁定。我希望這將會是類似日期選擇器所以我做了下面的腳本

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

      //handle the field changing 
      ko.utils.registerEventHandler(element, "change", function() { 
       var observable = valueAccessor(); 
       observable($(element).datetimepicker("getDate"));//**** 
      }); 

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

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

      if (value - current !== 0) { 
       $(element).datetimepicker("setDate", value); 
      } 
     } 
    }; 

但是,當我跑了劇本,我在javascript

TypeError: observable is not a function 

//****線得到一個錯誤,但我不能找到我在這裏做錯了什麼。

回答

1

我剛剛發現下面的代碼正在工作。由於很少有開源代碼可以做,所以這個插件並不是很穩定,有時候會用無效觀察值來調用change事件。所以我讓代碼抓住異常並繼續前進。

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

      //handle the field changing 
      ko.utils.registerEventHandler(element, "change", function() { 
       var observable = valueAccessor(); 
       try { 
        observable($(element).datetimepicker("getDate"));//**** 
       } 
       catch(ex) {} 
      }); 

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

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

      if (value - current !== 0) { 
       $(element).datetimepicker("setDate", value); 
      } 
     } 
    }; 
2

此特定錯誤是由於observable = valueAccessor()行造成的。通過將()添加到結尾,您正在賦值observable valueAccessor的值。爲了傳遞一個值來觀察到的這種方式,你需要,而不是寫:

var observable = valueAccessor; 

否則,可觀察到的是不是一個「觀察到的功能」。

+0

你說得對。現在正在工作。但爲什麼相同的代碼爲datepicker工作的原因是我不明白的事情。 – 2012-08-06 21:47:15

+0

我只是發現你的答案是錯誤的。 valueAccessor()應該給出正確的敲除觀察值。如果我使用你建議的'valueAccessor',那麼控件將永遠不會工作! – 2012-08-30 22:44:55

+0

這個答案有一半是正確的:[文檔專門做了OP的工作](http://knockoutjs.com/documentation/custom-bindings.html#modifying-observables-after-dom-events)。但是,這取決於如何定義綁定(請參閱:http://stackoverflow.com/a/18015621)。 – 2015-04-28 14:16:22

-1

替換該行

var observable = valueAccessor(); 

隨着

var xxxx= valueAccessor(); 

因爲你不能使用可觀察的,因爲它是在淘汰賽保留關鍵字。

此外,如果將observable用作變量名稱,將來可能會在某處出現錯誤。

+1

這沒有任何意義。保留關鍵字是javascript特徵,而不是knockoutjs特徵,此外,這涉及有限的範圍變量,這對同名的現有全局變量沒有影響。 – 2015-04-28 14:19:19