2017-10-18 18 views
1

J'utilise une configuration requirejs/crossroads.Knockout: Modifier la valeur observable

Ceci est mon bootstrapping avec quelques propriétés globales:

ko.applyBindings({ 
    route: router.currentRoute, 
    user: { 
     ... 
    }, 
    ... 
    loading: ko.observable(false), 
    setLoadingState: function(newState) { 
     this.loading(newState); 
    } 
}); 

Lorsque vous appelez la fonction setLoadingState à partir de composants (passé par params), il me dit que loading est pas une fonction/undefined.

Quelle est la bonne façon de mettre en œuvre de tels mécanismes?

Répondre

3

Notez que dans votre exemple (simplifié?), Vous n'avez pas besoin d'une méthode supplémentaire car elle ne fait que transmettre à loading, qui peut être appelée directement.


Soit utiliser une classe comme modèle pour vous assurer que this fait référence à votre modèle de vue comme ceci:

var MyApp = function(router) { 
 
    this.route = router.currentRoute, 
 
    this.loading = ko.observable(false); 
 
}; 
 

 
MyApp.prototype.setLoadingState = function(newState) { 
 
    this.loading(newState); 
 
}; 
 

 

 
ko.applyBindings(new MyApp(router));

(vous pouvez aussi utiliser la syntaxe class plus moderne)

Ou utiliser des objets simples via une fonction "usine":

var MyApp = function(router) { 
 
    var route = router.currentRoute, 
 
    var loading = ko.observable(false); 
 
    var setLoadingState = function(newState) { 
 
    loading(newState); 
 
    }; 
 
    
 
    // Expose what you want to expose: 
 
    return { 
 
    loading: loading, 
 
    setLoadingState: setLoadingState 
 
    }; 
 
}; 
 

 
ko.applyBindings(MyApp(router));

+1

Important: Je peux simplement l'appeler directement, il n'y a pas besoin des classes. Voulez-vous changer l'ordre de vos exemples? Peut-être que quelqu'un d'autre ne le remarquera pas. Merci beaucoup pour vos différentes solutions. – sandrooco