2012-05-25 4 views
18

Ist es überhaupt möglich, das entsprechende Element (oder die Elemente) zu erhalten, an das eine Daten (Modell) -Instanz gebunden war?KnockoutJs: Holen Sie das gebundene Element aus einer Modellinstanz

Zum Beispiel habe ich eine Reihe von 'Person' Objekte speichert in einer ViewModel-Eigenschaft.

Ich band das Ansichtsmodell zu der Ansicht, die es macht, zum Beispiel:

<div class="people" data-bind="template: { foreach: people }"> 
    <a href="#" class="person" data-bind="text: name"></a> 
</div> 

ich einige Event-Handler über jQuery dann binden:

$container.on('click', '.person', function(e){ 
    e.preventDefault(); 
    self.showPerson(ko.dataFor(this)); 
}); 

In meiner showPerson Methode würde ich sparen Verweis auf das Modell. Ich könnte/könnte auch einen Verweis auf das Element speichern, aber ich möchte nicht, wenn ich es nicht muss.

self.showPerson = function(person) { 
    // can i get the corresponding element from the 'person' model? 
}; 

Wer hat irgendwelche Ideen?

Antwort

8

Ihre Syntax und Verwendung von $ container mit jquery und dem zweiten Argument von '.person' ist unbekannt Iar zu mir, aber in Ihrem Click-Handler, ist nicht this das Element, das angeklickt wurde? Könnten Sie das nicht auch an Ihre showPerson-Methode weitergeben?

$container.on('click', '.person', function(e){ 
    e.preventDefault(); 
    self.showPerson(ko.dataFor(this), this); 
}); 

self.showPerson = function(person, element) { 
    // can i get the corresponding element from the 'person' model? 
}; 

Ich weiß nicht, einen Weg aus der Spitze von meinem Kopf, die Elemente zu erhalten, die eine beobachtbare gebunden wird, aber es könnte mehrere verschiedene Elemente sein. Sie könnten ein Textfeld für "name" haben, den Namen in einem Bereich anzeigen, in einer berechneten verwenden, Abonnenten haben und name() verwenden. Length in einer Berechnung in einer anderen Bindung zum Beispiel.

Das heißt, wenn Sie die Debug-Version von Knockout verwenden, können Sie sehen, dass Ihre Observablen eine _subscriptions Eigenschaft haben, die haben könnte, was Sie suchen. Die verkleinerte Version ist ein einzelnes Zeichen, denke ich.

+0

Danke für die Antwort. Natürlich ist der einfachste Weg, dies zu tun, ein Verweis auf das Element zu speichern, aber in meiner Frage, die ich erwähnt habe, möchte ich das nicht tun, wenn ich nicht muss. Aber ich denke, Ihre Antwort hat bestätigt, dass es nicht möglich ist, eine Liste von Elementen zu erhalten, an die das Observable gebunden war, was meiner Meinung nach keine API-Methode von knockoutjs ist. – badsyntax

5

Warum verschieben Sie nicht die Klickereignisbindung in Ihre foreach?

<a href="#" class="person" data-bind="text: name, click: showPerson"></a>

In diesem Fall Ihre showPerson() Funktion würde die richtigen Daten für person

EDIT:

Sorry, aber ich denke, ich den Kern Ihrer Frage verpasst:

self.showPerson = function (person, event) { 
    element = event.srcElement 
    ... 
} 
+0

Danke für die Antwort, aber das ist nicht, was ich frage. 'showPerson()' erhält die korrekten Daten. Ich frage, ob ich das entsprechende Element von der Model-Instanz bekommen kann, die an 'showPerson()' übergeben wird. – badsyntax

+0

event.srcElement funktioniert nur in IE. – vijayst

0
self.showPerson = function(data, event) { 
    // event.currentTarget is the DOM element 
    // $(event.currentTarget) gives the jQuery element 
} 
+1

Ich fragte, ob ich das Element aus dem Modell, nicht von den Event-Handler-Parametern abrufen könnte. – badsyntax

15

Sie können einfach eine benutzerdefinierte erstellen

// data-bind="element: observable" 
    // sets observable to element .. 
    ko.bindingHandlers.element = { 
     init: function(element, valueAccessor) { 
      var target = valueAccessor(); 
      target(element); 
     } 
    }; 

Ihrer Ansicht nach Modell verbindlich, erstellen Sie ein 'Feld', das Element zu speichern:

person.el = ko.observable(null); 

Dann in Ihrem HTML-Vorlage ..

<div data-bind="element: el"> .... </div> 
+2

Dies sollte die Antwort sein, denn das ist die einzige Lösung auf der Seite, die mir einfach Zugriff auf das gebundene Element aus dem internen Ansichtsmodell ermöglicht, nicht wenn es angeklickt wird, sondern sobald es gebunden ist. –

Verwandte Themen