Angular.copy在promise内与angularjs

时间:2015-12-15 11:34:53

标签: angularjs scope angularjs-scope angular-promise

我需要复制一个对象,但这个对象在一个promise中。 当我修改对象a时,对象b也被修改。 我知道这可能是由于带有承诺的异步模式,但我无法弄明白。

简化我的代码,我有类似的东西:

承诺:

$scope.search = function () {
    DocumentFactory.getDocuments(dataParams).then(function (data) {
      makeFacets(data);
    },
    function (data) {
      $scope.errorMessages.search = true;
    });
};

它将搜索许多主题并返回其中一些主题。 然后我创建一个包含这些主题的数组:

var makeFacets = function(data) {
  $scope.topics=[]; 
  $scope.topics[0] ={father: "General", label:""};
  $scope.topics[1] ={father: "International", label:""};
  $scope.topics[2] ={father: "Crime", label:""};
  $scope.topics[3] ={father: "NonLegal", label:""};
  [...]
};

一旦我拥有了这个对象,我就会用它来显示这些主题,并在主题内部进行过滤:

 <div class="filter-box">
   <input type="input" class="form-control" ng-model="filter.topic" ng-change="test1()">
 </div>
 <div class="filter-name" ng-repeat="data in topics">
    <span>{{data.label}}</span>
 </div>

我的最后一步是尝试在主题内部进行过滤,为此,我需要复制主题。

$scope.allTopics = [];
$scope.test1 = function(){
  if($scope.allTopics.length === 0){
    angular.copy($scope.topics, $scope.allTopics);
  }
  $scope.topics = $scope.allTopics;
  var filter = $scope.filter.topic;
  if(filter.length>=3){   
    for(var i = 0; i<$scope.topics.length; i++){
      if($scope.topics[i].children !== undefined){
        for(var j = 0; j<$scope.topics[i].children.length; j++){
          if($scope.topics[i].children[j].label.toLowerCase().indexOf(filter.toLowerCase()) === -1){
              $scope.topics[i].children.splice(j, 1);
          }
        }
      }
    }
  }
};

当然,这不起作用。我已经尝试了很多东西,但没有人在工作。

此外,我还尝试在此处添加副本:

$scope.search = function () {
    DocumentFactory.getDocuments(dataParams).then(function (data) {
      makeFacets(data);
      $scope.allTopics = [];
      angular.copy($scope.topics, $scope.allTopics);
    },
    function (data) {
      $scope.errorMessages.search = true;
    });
};

我每次修改主题对象时,都会修改所有主题对象。

1 个答案:

答案 0 :(得分:3)

问题是您在致电copy后正在进行作业。因此,这两个变量引用相同的对象,导致您观察到的问题。只需在复制完作业后复制作业,或复制作业而不是作业。

if($scope.allTopics.length === 0){
   angular.copy($scope.topics, $scope.allTopics);
}
$scope.topics = $scope.allTopics; // <-- this assignment is wrong

请注意,您也可以使用类似于任务的方式使用副本:

$scope.topics = angular.copy($scope.allTopics);