2014-06-23 1 views
0

J'ai besoin d'aide pour comprendre le concept de "regarder" les changements d'un objet et de le mettre à jour dans la vue.L'objet initialisé via la résolution n'est pas "surveillé"?

Dans mon cas particulier, l'objet est initialisé via la résolution de la vue puis affecté au paramètre scope avec le contrôleur.

Mon attente est que en quelque sorte si je mets à jour l'objet original à nouveau, puis il devrait changer la valeur imprimée dans la vue

var myApp = angular.module('myApp', ['ngRoute']); 

myApp.config(['$routeProvider', 
    function($routeProvider) { 
    $routeProvider. 
     when('/', { 
     template: 'hello {{ user.name }}', 
     controller: 'userController', 
     resolve: { 
      user: function() { 
      return {name: 'john'} 
      } 
     } 
     }). 
     otherwise({ 
     redirectTo: '/' 
     }); 
    }]); 

myApp.controller('userController', function($scope, user) { 

    $scope.user = user; 

    // I thought the object is supposed to be watched by reference but it is not 
    user = {name: 'doe'} 

}); 

plunker: http://plnkr.co/edit/w7woYVYB6GwCiJpWGWB4?p=preview

S'il vous plaît me dire ce que je fais mal et comment fixer

Modifier pour plus de précisions:

il est de ma faute d'ignorer la raison derrière tout cela . Ma résolution ressemble vraiment à ceci:

resolve: { 
       user: function() { 
       return userService.get(); 
       } 
      } 

Comme vous pouvez le voir, je retourne un objet pour résoudre (ce qui est une propriété définie à l'intérieur du UserService). Maintenant, mon espoir est que si je peux simplement appeler userService.update(); Dans mon contrôleur alors en quelque sorte le $ scope.user pointant toujours vers le même objet se mettra à jour automatiquement. Je suppose que non ....

userService.update(); 
+0

J'ai mis à jour ma réponse pour vous montrer comment implémenter la fonctionnalité $ watch. – zszep

Répondre

1

Le problème est simple. $ points de scope.user à un objet différent de ce que les points utilisateur après l'appel user = {name: 'doe'}

Le correctif est l'un d'entre eux

$scope.user={name:'doe';} 

ou

$scope.user.name='doe'; 

Mise à jour: Si la service met à jour les données et les contrôleurs veulent obtenir notifier l'approche à prendre serait d'élever des événements sur $ rootSscope. Dans le service que vous pouvez faire

$rootScope.$emit('event.userUpdate',{user:user}); 

Dans le contrôleur, vous pouvez prendre cet événement avec

$rootScope.$on('event.userUpdate',function(evt, args) { 
    //args should have he update user data, to rebind. 
}); 
+0

En fait, le problème est que cet utilisateur est supposé être mis à jour via un service, donc je préférerais simplement mettre à jour l'utilisateur et la portée reflètera cela, n'importe quelle solution du tout? – mr1031011

+0

Tant que le service met à jour le même objet utilisateur, tout fonctionne correctement. – Chandermani

+0

Merci Chandermani, j'ai mis à jour ma question pour plus d'informations, s'il vous plaît laissez-moi savoir si je ne suis pas assez clair. – mr1031011

0

Si je comprends bien ce que vous voulez atteindre, cela devrait fonctionner:

myApp.controller('userController', function($scope, user) { 

    $scope.user = user; 

    $scope.user = {name: 'doe'} 

}); 

Notez la ligne: $scope.user = {name: 'doe'} au lieu de user = {name: 'doe'}

Voici votre plunker modifié. En même temps que vous avez modifié votre question, j'ai également mis à jour ma réponse pour vous montrer comment implémenter la fonctionnalité $ watch. Dans ce cas, nous attendons un changement sur une variable willChange et changeons l'utilisateur en conséquence. Voici le plunker.

+0

merci zszep, j'ai mis à jour ma question avec plus d'info – mr1031011

Questions connexes