Angular $ watch数组和服务器更新

时间:2014-08-20 07:23:59

标签: javascript angularjs

我正在使用以下内容深入观看名为$scope.route.waypoints的数组:

$scope.$watch('route.waypoints',  _.debounce(function (prev, cur) {
    if(!$scope.initialized) return;
    $scope.saveRoute(true);
    console.log('route waypoints DEEP check');
}, 500), true)

在我的saveRoute方法中我PUT收集到服务器。

我想要做的是从服务器返回后我想再次更新我的waypoints集合中的一些属性。但是当我使用以下内容进行更新时:

if(data.linked && data.linked.waypoints.length){
        $scope.route.waypoints = data.linked.waypoints;
}else{
        $scope.route.waypoints = [];
}

$scope.route.days = data.routes[0].days;

再次调用$ watch,整个事情重新开始。 我怎么能避免这种情况?我尝试使用$ scope标志,但似乎它们再次被忽略。这一切都有点混乱......

2 个答案:

答案 0 :(得分:1)

您可以使用与此数据不同的变量。例如,对于来自服务器的数据,您可以使用

$scope.route.waypoints  

对于您的本地域数据,您可以使用其他域名,例如:

$scope.route.waypointsData

在这种情况下,您将获得更多控制权,因为您的服务器数据和本地数据将被分开

更新1

所以我的建议是

$scope.$watch('route.waypoints',  _.debounce(function (prev, cur) {
  //update data in this place  $scope.route.waypointsData 
}, 500), true)

然后也转向观察者

$scope.$watch('route.waypointsData ',  _.debounce(function (prev, cur) {
  // do your PUT method in that place 
}, 500), true)

并在ng-repeat中使用waypointsData。您正在手动同步模型之间的数据。

答案 1 :(得分:0)

好的,我通过扔掉一般的$手表解决了这个问题。在阅读了这篇优秀文章之后:http://www.benlesh.com/2013/10/title.html我致力于将所有内容移至ng-change指令并在必要时执行。 $ watches引入了一个不可测试的魔法,这是我问题的根源,它只是不再可读了。