2015-11-11 91 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)