AngularJS - comment forcer un champ d'application pour la mise à jour (promesse pour l'élément de tableau)

J'ai créé un contrôleur Angulaire qui ressemble à ceci (édité par souci de concision):

function AppCtrl($scope, $http, $location, $dataService) {
    $scope.projects = $dataService.data.projects;
}

Qui correctement les charges de la $scope.projects promesse de mon $dataService service.

app.service('$dataService', function($q, $http, $location, $rootScope) {
    var dataService = this; //Provides access 'this' inside functions below
    var projectsDeferred = $q.defer();

    $http.get('/api').success(function(data, status, headers, config) {
        projectsDeferred.resolve(data.projects);
    }).error(function(err) {
        projectsDeferred.reject(err);
    });

    this.data = {projects: projectsDeferred.promise};

    //UPDATE FUNCTION
    function updateObjectInArray(array, object, newData) {
        for(i in array) {
            if(array[i] == object) {
                if(newData != undefined) {
                    array[i] = newData;
                } else {
                    return array[i];
                }
            }
        }
        return undefined;
    }


    this.updateProject = function(project, updateData) {
        $http.put('/api/projects/' + project._id, updateData)
            .success(function(data, status, headers, config) {
            updateObjectInArray(dataService.data.projects.$$v, project, data);
        }).error(function(data, status, headers, config) {});
    };

});

J'ai créé un autre contrôleur qui ressemble à ceci, qui sélectionne un seul projet à partir de la matrice des projets sur la base de l'URL actuelle:

function ProjectCtrl($scope, $route) {
    //Getting the current project from the array of projects
    $scope.project = $scope.projects.then(function(projects) {
        for(i in projects) {
            if(projects[i]._id == $route.current.params.projectId) {
                return projects[i];
            }
        }
    });
}

Lorsque j'essaie de lancer mon updateObjectInArray() fonction (sur le succès de mon $http.put() demande), mon $scope.projects dans AppCtrl est correctement mis à jour (l'éventail de projets) mais mon $scope.project dans ProjectCtrl est pas mis à jour. Je peux me connecter array[i] à l'intérieur de la updateObjectInArray() fonction et il va enregistrer exactement ce que j'attends, et je peux me connecter $scope.projects dans AppCtrl et il mettra à jour en conséquence, mais quand j'essaie de me connecter $scope.project dans mon ProjectCtrl contrôleur, il n'est pas mis à jour en conséquence.

Je pensais que la raison était parce que je venais de faire appel $rootScope.$apply() ou $rootScope.$digest() après j'ai mis à jour le array[i] objet dans updateObjectInArray(), cependant, je reçois le message d'erreur que $digest is already in progress.

Que dois-je faire pour que mon $scope.project élément d'un tableau est mis à jour dans mon ProjectCtrl? Ai-je besoin pour résoudre une nouvelle promesse pour elle?

D'où appelez-vous updateProject? Vous êtes sûr que c'est avant de résoudre $dataService.les données.les projets? Essayez d'ajouter de la console.les journaux dans plusieurs fonctions
Non, je veux l'appeler après la résolution de $dataService.data.projects. La fonction première est qu'il tire de données à partir du serveur lorsque la page se charge tout d'abord, et un utilisateur peut effectuer une action qui va envoyer la mise à jour du serveur, et en cas de succès, la mise à jour de la portée avec les nouvelles données retournées par le serveur.
Je voulais dire après 🙂 Trop tôt encore.
Je l'appelle dans mon contrôleur lorsque l'utilisateur clique sur un bouton. Oui, je suis positif, il a déjà résolu. Comme je l'ai dit, je peux me connecter array[i] après la mise à jour de l'objet et il a été mis à jour exactement comme je l'attend, mais la journalisation de mon champ d'action montre qu'il n'a pas été mis à jour à ce $dataService.projects désormais d'égal à égal.
(Je voulais le type $dataService.data.projects)

OriginalL'auteur Matt Reyer | 2013-01-14