Я сохраняю все данные в localStorage. Когда флажок установлен, функция вызывается для изменения состояния элементов. Он работает нормально. Однако после обновления страницы последний отмеченный элемент получает флажок (или если он не установлен, он проверяется), в то время как другие работают нормально. Почему это последнее действие игнорируется после обновления страницы?
Вот код: http://codepen.io/kunokdev/pen/vGeEoY?editors=1010
(добавьте несколько элементов и нажмите "кликнуть меня" для всех из них, а затем обновите страницу, последнее действие будет проигнорировано)
Вид:
<div ng-app="TaskApp" ng-controller="ToDoCtrl">
<form>
<input type="text" ng-model="toDoItem">
<input type="submit" ng-click="addToDoItem()">
</form>
<div>
<ul>
<div
ng-repeat="item in toDoItems |
orderBy: 'createdAt'
track by item.createdAt">
<b>Content:</b> {{item.content}} <br>
<b>Completed?</b> {{item.completed}}
<md-checkbox ng-model="item.completed" ng-click="toggleToDoItem(item.completed)" aria-label="todo-checkbox">
CLICK ME
</md-checkbox>
</div>
</ul>
</div>
</div>
И JS:
var ls = {};
ls.get = function(key) {
return JSON.parse(localStorage.getItem(key));
};
// sets or updates a value for a key
ls.set = function(key, val) {
localStorage.setItem(key, JSON.stringify(val));
};
// returns true if value is set, else false
ls.isSet = function(key) {
var val = ls.get(key);
return ( null === val || 'undefined' === typeof val) ? false : true;
};
// removes a set item
ls.remove = function(key) {
localStorage.removeItem(key)
};
var TaskApp = angular.module('TaskApp', [
'ngMaterial',
'taskAppControllers'
]);
var taskAppControllers = angular.module('taskAppControllers',[]);
taskAppControllers.controller('ToDoCtrl', ['$scope',
function($scope){
//
loadToDoItems = function(){
var data = ls.get("toDoData");
if (data == null) data = [];
return data;
};
//
$scope.toDoItems = loadToDoItems();
//
$scope.addToDoItem = function(){
var toDoItems = $scope.toDoItems;
var newToDoItem = {
"content" : $scope.toDoItem,
"createdAt" : Date.now(),
"completed" : false
}
toDoItems.push(newToDoItem);
ls.set("toDoData", toDoItems);
$scope.toDoItem = "";
};
//
$scope.toggleToDoItem = function(item){
console.log('test');
var toDoItems = $scope.toDoItems;
for (var i = 0; i < toDoItems.length; i++)
if (toDoItems[i].createdAt === item){
if (toDoItems[i].completed == true)
toDoItems[i].completed = false;
else
toDoItems[i].completed = true;
}
ls.set('toDoData', toDoItems);
};
//
}]);
md-checkbox
предназначен для переключения того, что вы помещаете в ng-model
поэтому с вашим кодом md-checkbox
переключает completed
свойство, а затем вы меняете его обратно в своей функции $scope.toggleToDoItem
. Почему это сработало для всех предметов, кроме последнего щелкнутого, я не уверен.
Поэтому я изменил ng-click
чтобы сохранить элементы только в локальном хранилище и по-прежнему получил ту же проблему, что приводит к тому, что проблема связана с использованием ng-click
на md-checkbox
.
<md-checkbox ng-model="item.completed" ng-click="saveToLocalStorage()" aria-label="todo-checkbox">
CLICK ME
</md-checkbox>
$scope.saveToLocalStorage = function() {
ls.set('toDoData', $scope.toDoItems);
};
Поэтому я удалил ng-click
и установил часы на $scope.toDoItems
.
<md-checkbox ng-model="item.completed" aria-label="todo-checkbox">
$scope.$watch("toDoItems", function() {
ls.set("toDoData", $scope.toDoItems);
}, true);
-- РЕДАКТИРОВАТЬ --
Просто прочитайте документацию и почувствуйте себя идиотом, вы должны использовать ng-change
вместо ng-click
. Из документов относительно ng-change
:
Угловое выражение, которое должно выполняться, когда вход изменяется из-за взаимодействия пользователя с входным элементом.
При этом выше сказанное о том, что не нужно переключать completed
собственность, все еще стоит.
Вы передаете item.completed (в HTML) методу toggleToDoItem (item). В цикле массива вы затем сравниваете поле item.Created с параметром item.completed. Это сравнивает тип даты с Bool. Как это должно работать?