Pergunta

Dando uma olhada no knockout js e no plug -in de mapeamento. Percebi que, se eu passar um objeto, não posso assiná -lo para alterações. Basicamente, quero ser notificado se algum membro do objeto mudar. Eu realmente não me importo em recuperar o atributo que mudou (mas se for possível, gostaria de saber como)

function EventsKoModel(data){
    var self = this;
    self.event = ko.mapping.fromJS(data);
   //the below throws Error 
    //TypeError: self.event.subscribe is not a function
    self.event.subscribe(function(){
       console.log("something changed");
     });
}

var data = {
    'id': 14124124124124,
    'name': 'Some Event',
    'events': [{
       'id': 1
     },{
        'id': 2
      }]
}
var d = new EventsKoModel(data);
ko.applyBindings(d);

No entanto, se eu passar uma matriz com objetos, ele funciona, vi que, ao passar um objeto para Fromjs, o objeto devolvido não possui um método de assinatura existe de alguma forma para contornar isso?

Obrigado

Foi útil?

Solução

Supondo que você queira que o assinante atire cada vez que o event é atualizado, incluindo a primeira vez que é definido. Você poderia tentar isso;

function EventsKoModel(data){
    var self = this;
    self.event = ko.observable();
    self.event.subscribe(function(){
        console.log("something changed");
    });
    ko.mapping.fromJS(data, {}, self);
}

Outras dicas

Eu tinha os mesmos requisitos há algum tempo e escrevi reator nocaute para isso. Ele faz um bom trabalho em assinar modelos hierárquicos e fornece a maior parte da funcionalidade necessária para que você vá imediatamente.

Aqui está o link para ele:

https://github.com/ziadj/knockoutjs-reactor

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top