我有一个包含列表的数据库。我有一个表单,通过factory
向数据库列表添加一行。添加行后,服务器将发回更新的列表。使用$q.defer().promise
返回的$http.post
,我使用$scope
上的更新列表更新controller
中defer.resolve
的列表。
在测试的同时,我遇到了一个异象。我的问题是,如果我离开执行更新view
的{{1}}并在更新完成之前返回controller
,则更新完成时{{1}没有使用更新的列表更新 - 好吧,无论如何它都没有在view
中更新。如果我离开(在SPA内),然后再返回,我会得到正确的数据。
执行更新的$scope
会从view
函数中的factory
返回promise
。当promise解决后,post
会更新。
这是setData
耐心等待$scope
解决的代码:
controller
这是相应视图中的html,它应该与$http.post
:
promise.then(function() {
$scope.people = dataService.getData();
$scope.newperson = '';
$scope.submitting = false;
$scope.$apply();
});
我在这个JSBin中模仿了一个缓慢的服务器响应(使用setTimeout):https://jsbin.com/hihazegosi/1/edit?js,console,output
重新发布问题:
$scope.people
<li class="list-group-item" ng-repeat="person in people">{{person.firstName}} {{person.lastName}}</li>
并在5秒内返回People
。Home
并直接返回People
,您会看到该模型已更新。注意,如果你a)在帖子完成后导航回Home
,你会看到正确的数据。如果你b)留在People
,你会看到正确的数据。调用People
时不会检查People
,因为在所有情况下都会返回$scope.$apply()
,因此您会在方案b中看到错误。
有人可以解释这里发生了什么,是否有办法让$scope.$$phase
和'$digest'
在这种情况下保持同步?
答案 0 :(得分:4)
我相信发生的事情就是这样:
dataService.setData
承诺解决时,它所拥有的$scope
并不是指人员控制器的范围(它指的是你导航之前的旧控制器)。dataService.getData
,然后使用正确的值填充其$scope.people
我认为您需要将状态列表保存在状态更改的某个位置,例如:在dataService
服务中
您还可以使用$broadcast
在需要更新时将消息传递给控制器。你可以这样做:
dataService.setData
结算时$rootScope.$broadcast('peopleUpdated')
- 这将从根范围向下发送一条消息,直至您应用中的所有范围$scope.$on('peopleUpdated', function() { $scope.people = dataService.getData(); })