0

我想用knockout創建一個頁面,該模型包含一個可觀察數組。每個數組項中的其中一個屬性是日期,我正在嘗試使用jquery ui datepicker。可觀察數組中的KnockoutJS datetime選擇器

我在this question找到了一個datepicker的自定義bindingHandler的例子。但是,當我嘗試在我的代碼中使用它時,在更改事件處理程序期間出現javascript錯誤。

我的簡化代碼:

<table> 
    <thead> 
     <tr> 
      <th>My Date</th> 
     </tr> 
    </thead> 
    <tbody data-bind='foreach: visits'> 
     <tr> 
      <td><input data-bind='datepicker: MyDate' /></td> 
     </tr> 
    </tbody> 
</table> 

<script type="text/javascript"> 
    ko.bindingHandlers.datepicker = { 
     init: function(element, valueAccessor, allBindingsAccessor) { 
      $(element).datepicker({ dateFormat: 'dd/mm/yy' }); 

      //handle the field changing 
      ko.utils.registerEventHandler(element, "change", function() { 
       //get the value accessor 
       var observable = valueAccessor(); 

       //assign the observable value - code breaks here with 'Function expected' 
       observable($(element).datepicker("getDate")); 
      }); 

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

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

      //handle date data coming via json from Microsoft 
      if (String(value).indexOf('/Date(') == 0) { 
       value = new Date(parseInt(value.replace(/\/Date\((.*?)\)\//gi, "$1"))); 
      } 

      var current = $(element).datepicker("getDate"); 

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

    var VisitModel = function(visits) { 
     var self = this; 
     self.visits = ko.observableArray(visits); 

     self.getVisitsJSON = function() { 
      return ko.utils.stringifyJson(self.visits); 
     } 
    }; 

    var visitModel = new VisitModel([{"MyDate":"01/01/2013"}]); 
    ko.applyBindings(visitModel); 
</script> 

正如我在代碼中的註釋,我得到一個錯誤說「功能有望」當我打電話observable($(element).datepicker("getDate"));。我對knockoutjs相當陌生,我不確定爲什麼我得到這個錯誤,誰能幫忙解釋一下?

+0

但我鏈接的另一個問題是使用完全相同的代碼回答,你可以看到它在http://jsfiddle.net/rniemeyer/NAgNV/ – user1573618

+0

工作問題是,當你的數組是一個'observableArray'其中的元素不是。你綁定的值只是一個普通的javascript對象。 –

回答

1

您需要將數組內容包裝到具有可觀察屬性的自己的視圖模型中。像這樣的東西可能會奏效:

var VisitModel = function(visits) { 
    var self = this; 
    self.visits = ko.observableArray(); 

    for (var i = 0; i < visits.length; i++) { 
     self.visits.push(new DateModel(visits[i]); 
    } 

    self.getVisitsJSON = function() { 
     return ko.utils.stringifyJson(self.visits); 
    } 
}; 

var DateModel = function(date) { 
    var self = this; 
    self.MyDate = ko.observable(date.MyDate); 
} 

var visitModel = new VisitModel([{"MyDate":"01/01/2013"}]); 
ko.applyBindings(visitModel); 

現在,當您使用valueAccessor你應當得到的ko.observable這是一個功能。

+0

感謝您的回答,我已經將它應用到了現有的代碼中,但現在當我調用getVisitsJSON方法時,DateModel中的任何屬性(我稱它爲VisitDataModel,它有幾個屬性)都是可觀察的不包含在返回的JSON字符串中。爲什麼會發生這種情況? – user1573618

+0

ko.utils.stringifyJson不處理數組中的嵌套屬性,但是我發現了ko.toJSON。現在每個人都在工作,感謝你的幫助。 – user1573618

相關問題