我需要复制一个对象,但这个对象在一个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;
});
};
我每次修改主题对象时,都会修改所有主题对象。
答案 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);