2016-11-28 150 views
2

我正在使用angular,我試圖創建一個「全選」按鈕。indexof - 檢查一個值是否已經在javascript數組中)

我有一個項目列表,每個項目都有一個切換,我正在做的是,在變化(每次切換從真(選擇)變爲假(未選定),我運行一個函數來創建一個數組與

所選元素的所有ID。這工作幾乎是完美的,問題是我面臨的indexfOf方法的一些問題,以檢查是否ID已在數組中。

var isInArray; 

isInArray = function(arr, id) { 
    console.log("index of ", arr.indexOf(id)); 
    return arr.indexOf(id); 
}; 


scope.evtSelectAll = function() { 
    return angular.forEach(scope.listToDisplay, function(element) { 
    element.copyTo = true; 
    return scope.selectFromList(element.iID, element.copyTo); 
    }); 
}; 

scope.selectFromList = function(id, copy) { 
    if (copy === true && isInArray(scope.selected, id) === -1) { 
    scope.selected.push(id); 
    } else { 
    scope.selected.pop(id); 
    } 
    console.log("scope.selected - ", scope.selected); 
    if (scope.selected.length > 0) { 
    console.log("Emitted event: can proceed!"); 
    scope.$emit('enough-elements'); 
    } else { 
    console.log("Emitted event: can not proceed!"); 
    scope.$emit('not-enough-elements'); 
    } 
    return scope.result = scope.selected; 
}; 

的我得到的問題是當數組(scope.selected)有多個ID時

比方說,例如,我的s​​cope.selected看起來像這樣:

scope.selected = [2,3,4,7] 

如果我點擊全選,沒有被添加(這是正確的)

現在,讓我們說我勾去掉4和7例如,我的s​​cope.selected現在看起來是這樣的:

scope.selected = [2,3] 

如果我現在點擊全選,我的結果如下:[2,4,7]。

我失去了

我認爲這是由於這樣的事實,我的數組沒有一個單一的項目?

感謝您的任何幫助。這裏還有一個快速的codepen來解釋這個問題。如果您檢查控制檯並使用切換進行播放,您應該能夠立即看到我所指的內容。

在此先感謝

+2

如果完全清空$ scope.selected,並且一旦發生切換,通過重新分析列表中選中的元素來重新創建它會是一個問題嗎? –

+0

不,我不明白爲什麼它應該是一個誠實的問題。我只需要小心地將它清空,只是選擇我猜的全部,對吧? – Nick

+1

至少在codepen示例中,'element.iID'應改爲'element.id' – Matthias

回答

1

由於馬蒂亞斯基督教Bonato了他們的建議。

最後,我解決了使用他們的兩個建議,最終結果似乎按預期工作。

下面是與最終版本codepen:http://codepen.io/NickHG/pen/KNXPBb

基本上,我添加元素之前改變

scope.selected.pop(id); 

$scope.selected.splice(isInArray($scope.selected, id),1); 

,並在全選事件函數,我總是空scope.selected[]到陣列

$scope.evtSelectAll = function() { 
$scope.selected = [] 
angular.forEach($scope.list, function(element) { 
    element.copyTo = true; 
    return $scope.selectFromList(element.id, element.copyTo); 
}); 

};

謝謝你的幫助!

+1

清空陣列似乎是一個很好的解決方案,這裏的問題,好工作 – Matthias

+0

不要忘記接受你的答案作爲解決方案 – Matthias

+0

我只能在兩天內接受。我會盡快接受。謝謝 – Nick

0

我認爲你的代碼主要包含邏輯錯誤。您正在使用功能selectFromList取消選擇(單獨完成時)和全選(您不想用於取消選擇)。

正如有人在指出,由於某種原因,現在刪除回答,pop.()功能不應該與任何參數調用(它只是除去最後一個元素),你應該使用拼接這樣的: $scope.selected.splice(isInArray($scope.selected, id),1);

除非你真的需要發射功能上選擇的所有運行,你可以嘗試,如果這是你的答案:

var isInArray; 

isInArray = function(arr, id) { 
    console.log("index of ", arr.indexOf(id)); 
    return arr.indexOf(id); 
}; 


scope.evtSelectAll = function() { 
    return angular.forEach(scope.listToDisplay, function(element) { 
    element.copyTo = true; 
    if (isInArray($scope.selected, element.id) === -1) { 
     $scope.selected.push(element.id); 
    } 
    }); 
}; 

scope.selectFromList = function(id, copy) { 
    if (copy === true && isInArray(scope.selected, id) === -1) { 
    scope.selected.push(id); 
    } else { 
    $scope.selected.splice(isInArray($scope.selected, id), 1); 
    } 
    console.log("scope.selected - ", scope.selected); 
    if (scope.selected.length > 0) { 
    console.log("Emitted event: can proceed!"); 
    scope.$emit('enough-elements'); 
    } else { 
    console.log("Emitted event: can not proceed!"); 
    scope.$emit('not-enough-elements'); 
    } 
    return scope.result = scope.selected; 
}; 

現在全部選擇只增加​​如果沒有找到ID在​​列表中。

+0

的感謝您的答案。我添加了你的行,並且我改變了select all函數以包含第一個註釋(當我單擊select all時選擇了空的scope.Selected),並且使用兩個組合解決方案,它可以根據需要進行接縫工作。謝謝很多 – Nick

相關問題