Angular 1: последний флажок не остается установленным после обновления страницы

0

Я сохраняю все данные в 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);
    };
    //
}]);
Теги:
local-storage

2 ответа

1
Лучший ответ

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);

Codepen

-- РЕДАКТИРОВАТЬ --

Просто прочитайте документацию и почувствуйте себя идиотом, вы должны использовать ng-change вместо ng-click. Из документов относительно ng-change:

Угловое выражение, которое должно выполняться, когда вход изменяется из-за взаимодействия пользователя с входным элементом.

При этом выше сказанное о том, что не нужно переключать completed собственность, все еще стоит.

  • 1
    И еще раз, Rintarō Okabe спасает день!
0

Вы передаете item.completed (в HTML) методу toggleToDoItem (item). В цикле массива вы затем сравниваете поле item.Created с параметром item.completed. Это сравнивает тип даты с Bool. Как это должно работать?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню