2016-06-05 10 views
2

Ich kämpfe mit Datetimepicker und Datenformatierung. Meine Datumszeit wird in diesem Format gespeichert: "yyyy-mm-ddTHH:MM:ss.000".Wie wird das Datumsformat mit DateTimePicker und knockout-observable gehandhabt?

Wenn ich nicht formatiere, druckt mein Datum datetimepicker es falsch. Wenn ich das tue Format es, ich einen Fehler von meinem bindingHandlers erhalten:

[Error] TypeError: 09.04.2016 19:24:48 is not a function (evaluating 'observable($(element).val())')

Ich fühle mich wie ich etwas Deadlock bin hier fangen, aber sicher muss es eine Möglichkeit, um es?

HTML:

<input type="text" data-bind="datetimepicker:viewWhenDateTime,datetimepickerOptions:{dateFormat:'dd.mm.yy',timeFormat:'HH:mm:ss',addSliderAccess:true,sliderAccessArgs:{touchonly:false}}" /> 

JavaScript:

function ViewModel() { 
    var self = this; 
    self.whenDateTime = ko.observable("2016-04-09T19:24:48.000"); 
    self.viewWhenDateTime = self.whenDateTime().parseDate(); 
} 

BindingHandlers:

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).val()); 
     }); 

     //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).val(); 
     if (value - current !== 0) { 
      $(element).datetimepicker("setDate", value); 
     } 
    } 
}; 

Fiddle hier: http://jsfiddle.net/AsleG/nrsathdg/

Antwort

1

Ihre Bindung Handler ist Zwei-Wege: Es wird Versuchen um das Ding zu aktualisieren, als wäre es ein Observable. Jedoch, Ihre viewWhenDateTime daran gebunden ist nicht beobachtbar.

Da

  1. viewWhenDateTime auf einem anderen beobachtbaren abhängig ist; und
  2. viewWhenDateTime wird gebunden mit einem Zwei-Wege-Bindung Handler

Dafür brauchen Sie wahrscheinlich eine beschreibbare beobachtbar.

Etwas in dieser Richtung:

function ViewModel() { 
    var self = this; 
    self.whenDateTime = ko.observable("2016-04-09T19:24:48.000"); 
    self.viewWhenDateTime = ko.computed({ 
    read: function() { return self.whenDateTime().parseDate(); }, 
    write: function(newVal) { 
     // Do the inverse of `parseDate` here 
     // and set it to self.whenDateTime(....) 
    } 
    }); 
} 
+0

Danke, @Jeroen! Ich bin in der Nähe, aber ich bekomme einen verbindlichen Fehler: Nachricht: Binding kann nicht verarbeitet werden "datetimepicker: function() {return viewWhenDateTime}" Nachricht: ungültiges Datum. Dies scheint geschehen, bevor ich den Write-Teil des berechenbaren eingeben. –

+0

Soweit ich das beurteilen kann, sollten Sie versuchen, dieses Problem zu isolieren und eine separate Frage darüber zu stellen. Es scheint ein Problem mit 'parseDate' zu ​​sein, für das Sie den Code nicht zur Verfügung gestellt haben, und könnte ein Problem für sich sein? – Jeroen

+0

Sie könnten Recht haben. Wie auch immer, für mich sieht es so aus, als ob die whenDateTime vom bindingHandler abgeschnitten wird. In der Geige wird der Zeitteil nie gezeigt. Daher schlägt das "inversparseDate" fehl, da "newVal" nur Daten mit einem Leerzeichen nach dem "newVal" ist. Irgendeine Idee, warum die Kürzung geschieht? Geige: http://jsfiddle.net/AsleG/p7Ljmdny/ –