Angularjs 角度函数默认数据在视图中出现错误

Angularjs 角度函数默认数据在视图中出现错误,angularjs,function,scope,Angularjs,Function,Scope,我正在与Angularjs和Firebase一起开发一个调度应用程序。出于某种原因,当我编写函数来设置默认数据时,日期的顺序是周一、周二、周三、周四、周五,但我的视图显示的日期为周五、周一、周四、周二、周三。不知道为什么或如何修复,其他一切似乎都很好。 app.js angular.module('scheduleApp', ['firebase']) create our main controller and get access to firebase .cont

我正在与Angularjs和Firebase一起开发一个调度应用程序。出于某种原因,当我编写函数来设置默认数据时,日期的顺序是周一、周二、周三、周四、周五,但我的视图显示的日期为周五、周一、周四、周二、周三。不知道为什么或如何修复,其他一切似乎都很好。

app.js

    angular.module('scheduleApp', ['firebase'])
    create our main controller and get access to firebase
    .controller('mainController', function($scope, $firebase) {


      var ref = new Firebase("https://xxxxx.firebaseio.com/days");  
      var fb = $firebase(ref);

      var syncObject = fb.$asObject();

      syncObject.$bindTo($scope, 'days');

       $scope.reset = function() {    

fb.$set({
  monday: {
    name: 'Monday',
    slots: {

      100: {
        time: '10:00am',
        booked: false
      },
      110: {
        time: '11:00am',
        booked: false
      },
      120: {
        time: '12:00pm',
        booked: false
      },
      130: {
        time: '1:00pm',
        booked: false
      },
      140: {
        time: '2:00pm',
        booked: false
      },
      150: {
        time: '3:00pm',
        booked: false
      },
      160: {
        time: '4:00pm',
        booked: false
      },
      170: {
        time: '5:00pm',
        booked: false
      },
      180: {
        time: '6:00pm',
        booked: false
      }
 }
  },
  tuesday: {
    name: 'Tuesday',
    slots: {

      100: {
        time: '10:00am',
        booked: false
      },
      110: {
        time: '11:00am',
        booked: false
      },
      120: {
        time: '12:00pm',
        booked: false
      },
      130: {
        time: '1:00pm',
        booked: false
      },
      140: {
        time: '2:00pm',
        booked: false
      },
      150: {
        time: '3:00pm',
        booked: false
      },
      160: {
        time: '4:00pm',
        booked: false
      },
      170: {
        time: '5:00pm',
        booked: false
      },
      180: {
        time: '6:00pm',
        booked: false
      }
    }
  },
  wednesday: {
    name: 'Wednesday',
    slots: {

      100: {
        time: '10:00am',
        booked: false
      },
      110: {
        time: '11:00am',
        booked: false
      },
      120: {
        time: '12:00pm',
        booked: false
      },
      130: {
        time: '1:00pm',
        booked: false
      },
      140: {
        time: '2:00pm',
        booked: false
      },
      150: {
        time: '3:00pm',
        booked: false
      },
      160: {
        time: '4:00pm',
        booked: false
      },
      170: {
        time: '5:00pm',
        booked: false
      },
      180: {
        time: '6:00pm',
        booked: false
      }
  }
      },
      thursday: {
    name: 'Thursday',
    slots: {

      100: {
        time: '10:00am',
        booked: false
      },
      110: {
        time: '11:00am',
        booked: false
      },
      120: {
        time: '12:00pm',
        booked: false
      },
      130: {
        time: '1:00pm',
        booked: false
      },
      140: {
        time: '2:00pm',
        booked: false
      },
      150: {
        time: '3:00pm',
        booked: false
      },
      160: {
        time: '4:00pm',
        booked: false
      },
      170: {
        time: '5:00pm',
        booked: false
      },
      180: {
        time: '6:00pm',
        booked: false
      }
  }

      },

  friday: {
    name: 'Friday',
    slots: {

      100: {
        time: '10:00am',
        booked: false
      },
      110: {
        time: '11:00am',
        booked: false
      },
      120: {
        time: '12:00pm',
        booked: false
      },
      130: {
        time: '1:00pm',
        booked: false
      },
      140: {
        time: '2:00pm',
        booked: false
      },
      150: {
        time: '3:00pm',
        booked: false
      },
      160: {
        time: '4:00pm',
        booked: false
      },
      170: {
        time: '5:00pm',
        booked: false
      },
      180: {
        time: '6:00pm',
        booked: false
        }
      }
     }
       });    

      };

    });          
index.html

      <!DOCTYPE html>
         <html lang="en">
         <head>
        <meta charset="UTF-8">
        <title>Angular Scheduling</title>

        <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootswatch/3.3.0/journal/bootstrap.m    in.css">
        <link rel="stylesheet" href="style.css">

       <!-- JS -->
       <!-- load Angular, Firebase, Firebase Angular Library, and  custom    app.js -->
       <script   src="http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.0/angular.min.js"></script>
       <script src="https://cdn.firebase.com/js/client/1.1.1/firebase.js"></script>
<script src="https://cdn.firebase.com/libs/angularfire/0.8.0/angularfire.min.js"></script>
       <script src="app.js"></script>
    </head>
    <body>
    <div class="container" ng-app="scheduleApp" ng-controller="mainController">

       <div class="page-header text-center">       
      <h1>Schedule City</h1>        
      </div>

      <div class="row times">

      <div class="col-xs-4 text-center" ng-repeat="day in days">

       <h2>{{ day.name }} </h2>

       <div class="time-slot" ng-repeat="slot in day.slots">       
     <input type="checkbox" id="{{ day.name }}-{{ $index}}" ng- model="slot.booked" ng-disabled="slot.booked">
     <label for="{{ day.name }}-{{ $index }}">{{ slot.time }}<br>
     <span ng-if="slot.booked">Booked</span>
     <span ng-if="!slot.booked">Available</span>
   </label>
   </div>
     </div>    

    </div>

     <p class="text-center">    
    <a href="#" class="btn btn-primary" ng-click="reset()">Reset</a>
    </p>

    </div>  
    </body>
   </html>      

角度调度
计划城市
{{day.name}
{{slot.time}}
预定 可用


订单
字段添加到数据中。乙二醇

  monday: {
    name: 'Monday',
    order: '1',
    slots: {
 etc...
然后呢

ng-repeat="day in days | orderBy:'order'"
ng-repeat="dayName in dayNames"
更新:由于您没有数组,这可能不起作用。有关一些提示,请参见中的迭代对象属性

一个想法是自己在一个新变量中定义顺序,迭代该变量并使用它从原始对象中检索正确的值

$scope.dayNames = ["monday", "tuesday"...];
然后呢

ng-repeat="day in days | orderBy:'order'"
ng-repeat="dayName in dayNames"
然后使用days[dayName]抓取对象,例如。g

ng-repeat="slot in days[dayName].slots"
更新:像这样:

  <div class="col-xs-4 text-center" ng-repeat="dayName in dayNames">

   <h2>{{ days[dayName].name }} </h2>

   <div class="time-slot" ng-repeat="slot in days[dayName].slots">       
 <input type="checkbox" id="{{ days[dayName].name }}-{{ $index}}" ng- model="slot.booked" ng-disabled="slot.booked">
 <label for="{{ days[dayName].name }}-{{ $index }}">{{ slot.time }}<br>
 <span ng-if="slot.booked">Booked</span>
 <span ng-if="!slot.booked">Available</span>
....

{{days[dayName].name}
{{slot.time}}
预定 可用 ....
非常感谢您的全面回复。我已经做了更新,它删除了所有日期的名称,只允许我从第一天的列中选择时间段。即使我在第3天、第4天单击某个时段,该时段也会高亮显示,并仅在第一列中标记为已预订。不过,您确实帮助我走上了正确的方向。@sp312您能展示一下您迄今为止对该解决方案的尝试吗?如果不重写代码将其更改为数组,我就无法找到正确的方法来解决此问题。我意识到angular会自动按字母顺序排列对象,所以为了练习,我做了一个作弊,在每个对象前面按字母顺序添加字母,就像这样。当然不会像这样离开,但至少我现在知道了这个问题,这将使它更容易解决$set({amonday:{name:{Monday',slots:{btuesday:{name:{sunday',slots:{解决这个问题的最好方法似乎是添加对象的键,正如这些链接所示。我会尽快尝试并报告。老实说,我不确定。我用你的代码添加了dayName]和var syncObject=fb。$asObject();syncObject.$bindTo($scope,'dayOrder');$scope.dayOrder=[“星期一”、“星期二”、“星期三”、“星期四”、“星期五”];$scope.reset=function(){fb.$set({星期一:{name:'Mon',slots:{这给了我一个空白页。我得到的最接近的是第一个解决方案