2015-11-11 53 views
0

我有对象words和一个应该隐藏该对象的特定元素的复选框,但是我无法使它工作。无法获取array.splice在Angular中工作

<body ng-controller="ArrController"> 
    <input type="checkbox" ng-model="hide"> {{kc}} 
    {{words}} 
</body> 

ArrController

app.controller('ArrController', function ($scope, $http) { 

$scope.hide = false; 

$http.get('array.json').success(function(data) { 
    var keyword = 'lol'; 
    $scope.words = data.unsorted_arr; 
    $scope.$watch('hide', function() { 
     if ($scope.hide == true) { 
      var remove = function() { 
       $scope.words.splice(keyword, 1);  
      } 
      $scope.kc = 'hidden'; 
     } else { 
      $scope.kc = 'not hidden'; 
      $scope.words = data.unsorted_arr; 
     } 
    }); 

}); 
}); 

文件array.json包含数据words:根据复选框状态

{"unsorted_arr":{"gonna":3,"lol":114,"wouldn":2,"know":6,"lowkey":2,"man":5}} 

kc修改,但words保持不变。

我在哪里错了?

+0

我真的不能遵循表的流程。如果$ scope.hide = = true,将一个变量设置为一个函数。但我不知道它在哪里叫 – Fraction

+0

@分数是的,那是一个错误。用'var remove = $ scope.words.splice(keyword,1)'修改该行;'如下面提到的那样,但它仍然不起作用。 – neptune

回答

1

Splice用于删除数组中的某些东西,它将两个整数作为参数。

因为你有一个对象,只要使用删除:

delete $scope.words[keyword]; 

通过这样做,$ scope.words = data.unsorted_arr,两个变量指向同一个对象,因此删除的东西从$ scope.words会将其从data.unsorted_arr中删除。

保持对它的引用,所以你可以稍后重新填充它:

var word = $scope.words[keyword]; 
... 
delete $scope.words[keyword]; 
... 
$scope.words[keyword] = word; 
+0

这与拼接不同。 'delete'会创建空白,而'splice'会移动内容以保持连续的数组。 –

+0

这似乎是偏心的。它也修改'kc'和'words',但是当我取消选中复选框时,'words'仍然没有隐藏的元素。 – neptune

1

在您的例子要定义删除元素的功能,但功能永远不会被调用。

var remove = function() { 
    $scope.words.splice(keyword, 1);  
} 

你可能需要你的逻辑删除功能(因为它似乎并不需要),并用delete语句来替换使用splice的:

$http.get('array.json').success(function(data) { 
    var keyword = 'lol'; 
    $scope.words = data.unsorted_arr; 
    $scope.$watch('hide', function() { 
     if ($scope.hide == true) { 
      delete $scope.words[keyword]; 
      $scope.kc = 'hidden'; 
     } else { 
      $scope.kc = 'not hidden'; 
      $scope.words = data.unsorted_arr; 
     } 
    }); 

}); 
+0

或者至少将其更改为'var remove = $ scope.words.splice(keyword,1);'如果他希望'remove'包含已删除的元素。 –

+0

试过这个,但脚本根本没有反应。变量'kc'和'words'保持不变。使用函数(如我的例子)'kc'被修改,'words'不被修改。 – neptune

+0

哦,还有'关键字'是不正确的。你需要它是'..splice($ scope.words.indexOf(keyword),1)' –

1

你混淆了索引与关联数组阵列,

方法Array.splice是Indexed Arrays的方法, 你有一个简单Javascript Object (associative array) ...

012对POJO

可以使用删除操作或简单地重新分配给未定义:

var a = { foo: 'baz' }; 
 

 
delete a['foo']; 
 

 
var b = ['foo', 'baz']; 
 

 
b.splice(0, 1)