2016-04-08 16 views
0

Ich habe eine VM mit den folgenden:Artikel zu ObservableArray() hinzufügen und warten, bis es hinzugefügt wird?

var myArray = ko.observableArray(), 
.... 
addItem = function(data) { 
    myArray.unshift(data); 
}, 

Meiner Ansicht ich einige HTML haben, die es bindet:

<div data-bind="foreach: myArray"> 
    ....<label data-bind:="attr: { id: 'myLabel_' + name }"></Label> 
    </div> 

Alles funktioniert super - wenn ich die addItem aufrufen Funktion ein Element hinzugefügt wird zu meinem obserablenArray() und Knockout fügt das entsprechende HTML hinzu.

Das Problem, dem ich jetzt gegenüberstehe, ist, wenn ich, anstatt einfach HTML zu verwenden, versuche, ein komplexeres Steuerelement (wie ein Kendo-Gitter) zu verwenden. Ich muss eine Javascript-Methode aufrufen, um das Raster zu initiieren, wenn ich newItem aufruft. Aber wenn ich das tue, funktioniert es nicht (ich nehme an, weil Knockout nicht "fertig" ist, was es tut, wenn die Kendo-Steuerung versucht, das zu tun, was sie tun muss).

Die folgende nicht funktioniert:

var myArray = ko.observableArray(), 
.... 
addItem = function(data) { 
    myArray.unshift(data); 
    var test = $('#myLabel_nameOne'); 
    // Kendo specific code to setup test 
}, 

Wenn ich den gleichen Kendo spezifischen Code von der Konsole ausführen - es funktioniert super. Wenn ich ein setInterval verwende, funktioniert das auch.

Ich weiß, dass es ein 'afterRender' gibt, in das ich mich auf einer ganzen Vorlage einhaken kann - aber ich möchte nur wissen, wann die Benutzeroberfläche fertig ist, nachdem ein einzelnes Objekt in dieses ObservableArray eingefügt wurde.

Was ist die richtige Art zu sagen: "Warte, bis das wirklich hinzugefügt wird, dann geh und mach das andere Zeug?" Oder "Fügen Sie dies hinzu, und wenn die Benutzeroberfläche bereit ist, rufen Sie diese Funktion für mich auf"?

+0

Es ist wie Sie fühlt haben ein XY-Problem. Das eigentliche Problem, mit dem wir nicht ganz helfen können, weil Sie ein bisschen zu viel vereinfacht haben (wir brauchen eine Wiederholung dafür), und die Frage, die Sie am Ende stellen, ist wirklich vage ohne mehr Kontext. – Jeroen

+0

Es ist alles in der [Docs ...] (http://knockoutjs.com/documentation/foreach-binding.html#note-7-post-processing-oder-animating-the-generated-dom-elements) – Tyblitz

Antwort

1

Ich habe asynchrone Probleme mit anderen Frameworks als Knockout und in der Regel löste sie durch Schreiben von Wrappern mit jQuery und dem Deferred() -Objekt.

Nachdem Sie die Knockout-Dokumentation gelesen haben, können Sie einfach die Subscribe-Funktion verwenden.

var myArray = ko.observableArray() 
 
myArray.subscribe(function(data) { 
 
    var test = $('#myLabel' + data.name); 
 
    // Kendo specific code to setup test 
 
}); 
 
    .... 
 
addItem = function(data) { 
 
    myArray.unshift(data); 
 
},

+0

Danke für den Vorschlag. Seltsamerweise funktioniert das großartig in Chrome und Firefox, funktioniert aber nicht in IE. Ich aktualisiere meine Frage, um Code einzufügen, der mein Problem reproduziert. –

+0

Hmmm das scheint ein bisschen seltsam. Fügen Sie direkt nach der Verschiebung ein Console Debug-Kommando und ein zweites in Ihrer Subscribe-Funktion hinzu, um die Ausführungsreihenfolge zu überprüfen. – BlueWater86

Verwandte Themen