Angular 1:最后一个复选框没有'刷新页面后不要保持选中状态
Angular 1: Last checkbox doesn't stay checked after page refresh
我正在将所有数据保存到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
更改为仅将项目保存到本地存储,但仍然遇到相同的问题,这使我相信问题是由在md-checkbox
上使用ng-click
引起的。
<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);
Codepen
--编辑--
只要阅读文档,就会觉得自己像个白痴,应该使用ng-change
而不是ng-click
。来自有关ng-change
:的文档
当输入由于用户与输入元素的交互而发生更改时要执行的角度表达式。
也就是说,上面关于不需要自己切换completed
属性的内容仍然有效。
您正在将item.completed(在HTML中)传递给toggleToDoItem(item)方法。在数组循环中,然后比较项目。item.comcompleted参数的已创建字段。这是将Date类型与Bool进行比较。这是怎么回事?
- AngularJS-状态更改时停止自动刷新页面
- 制作一个按钮倒计时计时器,该计时器将在5分钟后永久禁用,即使在页面刷新时也应保持禁用状态
- Selectbox选项在页面刷新jsp后保持选中状态
- 在浏览器刷新时保存XHR渲染状态
- 导航到子状态也会刷新其父状态
- 页面刷新后,所选选项卡处于非活动状态
- 维护手动页面刷新时通过AJAX加载的状态/内容
- Angular 1:最后一个复选框没有'刷新页面后不要保持选中状态
- Angular UI路由器无法识别页面刷新时的状态
- AngularJs:UI路由器浏览器刷新,移动到第一个子状态
- 如何在React.js中维护页面刷新后的状态
- 如何在使用 Firebase 登录或注销时更改状态而不刷新
- 刷新子组件更改时的应用状态
- 显示 ui 路由器模式而不刷新父状态
- 刷新窗口后,下拉列表未保持选中状态
- 如何在页面刷新之前保持悬停状态为非悬停状态
- HTML5历史API弹出状态重新加载野生动物园刷新页面无休止
- 自动刷新后保存 Web 的状态
- 请记住在刷新后使用 jQuery 切换状态
- 记住状态刷新- jQuery与cookie