无法设置“”的属性;某事“;在尝试创建按日期排序的数组时出现未定义错误

Cannot set property of "something" of undefined error while trying to create an array sorted by dates.

本文关键字:数组 排序 日期 错误 未定义 设置 属性 某事 创建      更新时间:2023-09-26

我在Stack Overflow上发布了一个相关问题,@Kato帮我给出了答案。我正试图实现他的答案,但得到了一个错误Cannot set property of"something"of undefined。

我做了一个尽可能详细的plnkr:http://plnkr.co/edit/M4zEjpZ4kqTKn1sHHMt6

//controller
angular.module('app').controller('DemoCtrl', function($scope, DatedList) {
  $scope.world = 'world';
  var listRef = new Firebase("https://talllly.firebaseio.com/");
  $scope.weeks = DatedList(listRef);
  $scope.addTask = function(){
    listRef.push({    
      text: $scope.task.text,
      week: 40,
      day: 2  
    });   
  };

});       
angular.module('app').service('DatedList', function($timeout) {
  return function(pathToList) {
    var list = {};  
    pathToList.on('child_added', function(snap) {
      $timeout(function() { // force Angular to run $digest when changes occur
        var data = snap.val();
        console.log(data);
        var week_number = data.week;
        var week_day = data.day;
        list[week_number][week_day] = data;
      });
    });
    //todo: write similar processing for child_changed and child_removed
    return list;
  }  
});
//html
<form ng-submit="addTask()">
      <input placeholder="add task" ng-model="task.text">
    </form>
    <div ng-repeat="(week, days) in weeks">    
     <h1>{{week}}</h1>
     <div ng-repeat="(day, items) in days">
        <h2>{{day}}</h2>
        <div ng-repeat="item in items">
           {{item|json}}
        </div>
     </div>
    </div>

您需要初始化list[week_number]:

pathToList.on('child_added', function(snap) {
  $timeout(function() { // force Angular to run $digest when changes occur
    var data = snap.val();
    console.log(data);
    var week_number = data.week;
    var week_day = data.day;
    list[week_number] = {};  // <- Add this line here
    list[week_number][week_day] = data;
  });
});

出现该错误的原因是,您正试图将一个属性添加到列表[week_num]中,但它不是对象。

你可以做

list[week_number] = list[week_number] || {};
list[week_number][week_day] = data;

if(!angular.isObject(list[week_number]) {
    list[week_number] = {};
}
list[week_number][week_day] = data;