knockout.js - pobierz ViewModel z elementu DOM

83

czy jest możliwe uzyskanie powiązanego obiektu JavaScript ViewModel z danego elementu DOM?

ko.applyBindings( gLoginViewModel, document.getElementById("login-form") );
ko.applyBindings( gLoginViewModel, document.getElementById("register-form") );

a gdzie indziej - w raczej niepowiązanym kodzie - coś takiego:

var viewModel = ko.getViewModel( formElement );
viewModel.someObservable( someData ); // observable available in all ViewModels

byłoby nawet lepiej, gdybym mógł zrobić coś takiego:

var viewModel = ko.getViewModel( someChildElement );
Dirk Boer
źródło

Odpowiedzi:

138

Knockout ma dwie metody użytkowe, które mogą w tym pomóc.

  • ko.dataFor zwróci ViewModel, z którym jest powiązany element.
  • ko.contextForzwraca „kontekst wiązania” bieżącego elementu. Obiekt, który otrzymasz tą metodą zwróci coś takiego:

    { 
        $data: ...,
        $parents,
        $root
    }
    

Więc jeśli rozumiem twoje pytanie, prawdopodobnie możesz użyć ko.dataFortutaj. Oto prosty przykład użycia dataFor.

Andrew Whitaker
źródło
13
Cóż, są one udokumentowane tutaj: knockoutjs.com/documentation/unobtrusive-event-handling.html :)
RP Niemeyer,