2014-01-06 2 views
1

Я чувствую, что мне не хватает чего-то очевидного здесь, но я все еще в тупике.Область AngularJS не обновляется после изменения данных в заводском методе

Я обновляю Thing в области, вызывая функцию create на ThingFactory. Но когда я ссылаюсь на область действия PromoteController, область действия все еще содержит старую версию Thing (с идентификатором 1).

Это похоже на место, где я бы хотел использовать $ scope. $ Apply(), но это вызывает ошибку «дайджест уже в процессе».

Что мне не хватает?

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

    app.factory('ThingFactory', ['$http', '$q', '$routeParams', function ($http, $q, $routeParams) { 

    var deferred = $q.defer(); 

    return { 
     get: function(id) { 

      var thing = { 
       id: 393, 
       name: 'Can I be gotten?', 
       description: 'get' 
      }; 
      deferred.resolve(thing); 
      return deferred.promise; 
     }, 
     save: function (thing) { 
      console.log("ThingFactory -> CREATE"); 
      var thing = { 
       id: 122, 
       name: 'after create.', 
       description: 'creatine' 
      }; 
      deferred.resolve(thing); 

      return deferred.promise; 
     }, 
     init: function() { 
      console.log("ThingFactory -> INIT"); 
      var thing = { 
       id: 1, 
       name: 'initial value', 
       description: 'INIT' 
      }; 
      deferred.resolve(thing); 
      return deferred.promise; 
     } 
    }; 

}]); 

app.config(function ($routeProvider, $locationProvider, $httpProvider) { 
    $locationProvider.html5Mode(true); 
    $routeProvider 
     .when('/build', { 
      templateUrl: '/build.html', 
      controller: 'BuildController' 
     }) 
     .when('/things/:id/promote', { 
      templateUrl: '/promote.html', 
      controller: 'PromoteController' 
     }) 
}); 


app.controller('BuildController', function ($scope, $http, $location, ThingFactory) { 
    // HERE I INITIALIZE THE THING 
    ThingFactory.init().then(function(thing) { 
     $scope.thing = thing; 
    }); 

    $scope.saveNewThing = function() { 
     // HERE I 'SAVE' THE THING 
     ThingFactory.save($scope.thing).then(function(thing) { 
      $scope.thing = thing; 
      $location.path("/" + thing.id + "/promote"); 
     }) 
    } 

}); 

app.controller('PromoteController', function ($scope, $http, $routeParams, ThingFactory) { 
    // HERE'S WHERE THE THING ON THE SCOPE SHOULD HAVE AN ID OF 122, 
    // BUT IS STILL 1 
    var id = $routeParams.id; 
    ThingFactory.get({id: id}).then(function(thing) { 
     $scope.thing = thing; 
    }); 
}); 

ответ

2

, пожалуйста, создайте var отложенное = $ q.defer(); для каждого метода в вашем заводе. в противном случае вы всегда используете одно и то же отложенное, и это разрешается с помощью значения в вашей функции init.

+0

Конечно же, это была проблема! Большое спасибо за ваше быстрое наблюдение. – yalestar

Смежные вопросы