2016-08-30 2 views
0

Я пытаюсь установить логическое свойство для элемента в моем объекте массива, который у меня есть в моей области видимости.Неопределенная переменная области в приложении AngularJS

В приведенном ниже коде, когда я пытаюсь установить задачи [id] .deleted = true, я получаю следующую ошибку.

angular.js:12798 TypeError: Cannot set property 'deleted' of undefined 
at Scope.$scope.delete (main.js:54) 

Где я иду не так?

Мой весь код файла:

angular.module('ngMaterialTaskListApp') 
.controller('MainCtrl', function ($scope, $mdDialog, TaskService) { 

    // Model from which View populates data 
    $scope.tasks = []; 
    console.log($scope.tasks); 

    $scope.showAddDialog = function (ev) { 
     $mdDialog.show({ 
      controller: DialogController, 
      templateUrl: '../views/add-dialog-template.html', 
      parent: angular.element(document.body), 
      targetEvent: ev, 
      clickOutsideToClose: true, 
      fullscreen: true, //Only for xs and sm screen sizes 
      locals: { //For DialogController, as tasks 
       tasks: $scope.tasks 
      } 
     }); 
    }; 
    /*----------- Function to delete items onClick of delete icon -----------*/ 
    $scope.delete = function (id) { 
     console.log($scope.tasks[id]); 
     console.log(id); 
     // console.log($scope.tasks[id].name); 
     $scope.tasks[id].deleted = true; 
    }; 

    /*----------- DialogController function -----------*/ 
    function DialogController($scope, $mdDialog, tasks) { 
     $scope.task = {}; 
     $scope.hide = function() { 
      $mdDialog.hide(); 
      //TODO Add a message as to what happened 
     }; 
     $scope.cancel = function() { 
      $mdDialog.cancel(); 
      //TODO Add a message as to what happened 
     }; 
     /*----------- Method show the add dialog -----------*/ 
     $scope.addData = function() { 
      if (null !== $scope.task.name && null !== $scope.task.description) { 
       /*----------- Using moment.js to parse date and time -----------*/ 
       $scope.task.date = moment($scope.task.date, '').format('DD MMM YYYY'); 
       $scope.task.time = moment($scope.task.time, '').format('h:mm a'); 
       $scope.task.done = false; // Every new task is pending! 
       $scope.task.deleted = false; // Every new task exists! 
       var GlobalID = Date.now(); 
       console.log(GlobalID); 
       $scope.task.id = GlobalID; 
       /*----------- Performing http POST -----------*/ 
       TaskService.postTask($scope.task); 
       /*----------- Pushing to tasks object in $scope of MainCtrl -----------*/ 
       // Have to update tasks again 
       tasks.push($scope.task); 
       $scope.hide(); 
       console.log(tasks); //DEBUGGING 
      } else { 
       //TODO ADD INVALID/NULL DATA WARNING 
      } 
     }; 
    }; 
    // DEPRECATED - USED FOR DATA WHEN SERVER NOT AVAILABLE 
    TaskService.getTasks().then(function (response) { 
     $scope.tasks = response.data.tasks; 
    }, function (error) { 
     console.log(error + "This"); 
    }); 
    //USING THIS TO GET DATA FROM SERVER 
    TaskService.getAllTasks().then(function (response) { 
     // console.log(response.data); 
     $scope.tasks = response.data; 
     console.log($scope.tasks); 
    }); 
}); 
+0

проверить, если '$ сфера. tasks [id] 'существуют, потому что это' undefined' – gianlucatursi

+1

. Вы используете идентификатор элемента в этом массиве, но '$ scope.tasks [id] .deleted' будет использовать индекс на основе нуля для поиска элемента. Например, массив с 3 элементами будет [0], [1] или [2] .. если вы передаете идентификатор со значением 4, вы будете искать 5-й элемент в массиве из 3-х элементов. Таким образом, элемент будет неопределенным и не будет свойства 'deleted' – Jorrex

ответ

0

Как ваш HTML? Держу пари, как это внутри кнопки в нг-повтора:

ng-click="delete(task.id)" 

Попробуйте положить так:

ng-click="delete($index)" 
Смежные вопросы