knockout.js - Obtener ViewModel del elemento DOM

83

¿Es posible obtener el objeto JavaScript ViewModel enlazado de un elemento DOM dado?

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

y en otro lugar, en un código bastante no relacionado, algo como esto:

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

incluso sería mejor si pudiera hacer algo como:

var viewModel = ko.getViewModel( someChildElement );
Dirk Boer
fuente

Respuestas:

138

Knockout tiene dos métodos de utilidad que pueden ayudar aquí.

  • ko.dataFor devolverá el ViewModel al que está vinculado el elemento.
  • ko.contextFordevuelve el "contexto de enlace" del elemento actual. El objeto que obtiene de este método devolverá algo como:

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

Entonces, si entiendo tu pregunta, probablemente puedas usar ko.dataForaquí. Aquí hay un ejemplo simple usando dataFor.

Andrew Whitaker
fuente
13
Bueno, están documentados aquí: knockoutjs.com/documentation/unobtrusive-event-handling.html :)
RP Niemeyer