2016-04-22 15 views
0

Ich konnte keine funktionierenden Lösungen für mein Problem finden, aber ich weiß, dass es eine triviale Art ist, es zum Laufen zu bringen, aber ich kann es nicht herausfinden.Manueller Aufruf einer Methode in Knockout Extender

Ich habe einen Extender namens LiveEditor, der zwischen einem Anzeigetext und einem Eingang umschaltet, wo der Benutzer einen Wert eingeben kann. Es funktioniert gut mit Eingaben und Textareas, aber ich konnte es nicht mit datypicker verwalten.

geht hier mein Code

HTML:

<div data-bind="liveEditor: Date"> 
    <span class="view" data-bind="text: Date, event: {click: Date.edit}">15.04.2016</span> 
    <span data-bind="event: { click: Date.stopEditing }" class="ok"></span> 
    <input value="15.04.2016" data-bind="datetime: Date, event: {blur: Date.stopEditing}" /> 
</div> 

JS:

ko.extenders.liveEditor = function (target) { 
    target.editing = ko.observable(false); 
    target.edit = function() { 
     target.editing(true); 
    }; 

    target.stopEditing = function() { 
     target.editing(false); 

     //save 
     this.saveModel(); //run a method on viewmodel 
    }; 
    return target; 
}; 

ko.bindingHandlers.datetime = { 
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext){ 
     var value = valueAccessor(); 
     var $el = $(element); 

     if (ko.isObservable(value)){ 

      $el.data('kendoDatePicker').on('close', function(e,dataItem){ 
       // what should I write here to call a stopEditing method? 
      }); 
     } 
    } 
}; 

Es funktioniert, wenn ich auf OK-Schaltfläche klicken.

Vielen Dank im Voraus für jede Hilfe!

Antwort

1

was soll ich hier schreiben, um eine stopEditing-Methode aufzurufen?

Die beobachtbare von valueAccessor() zur Verfügung steht, so:

valueAccessor().stopEditing(); 

, dass sie als von der Zeit das Ereignis eintritt zugreifen. Wenn es wichtig ist, dass Sie den Wert so verwenden, wie er war, als init aufgerufen wurde, schließen Sie das in avlue, also wäre es value.stopEditing().

Zwei weitere Alternativen für Sie (aber ich denke, dass ich die oben tun würde):

  • Sie könnten der events von allBindings Bindung zugreifen und dann und greifen seine blur Bindung und nennen es
  • Sie könnten triggert ein blur Ereignis auf dem input
+0

Danke für die Wiederholung. Ich musste auch viewModel senden, weil ich einen Fehler bei der saveModel-Methode habe, die in "this" nicht existiert (in stopEditing-Funktion) –