2016-02-14 49 views
0

我一直进展相当好与路线angularjs,观点& UI的引导,但现在,我与范围数据和双向绑定,我有一些麻烦的工作。用ng-repeat,我发现你也可以将循环绑定到你的控制器中的foreach来做额外的处理,所以我试图让这两个一起工作。如何使用ng-repeat和foreach获得双向绑定?

我一直在试图找出范围,angularjs NG重复。我有一个人名单,每个人都有一个weekSchedule对象,我在那里建立一个表格,表示一周的时间表信息。

我环者(外)的列表,然后我环路的阵列编号为1 - 7(内)。时间表数据包括一个“星期几”号码与日期号码匹配,然后有一些逻辑可以用日程安排时间填充信息,或者如果不匹配则保留空白。但这种逻辑的细节在这里并不重要。为此,我需要每个特定人员的weekSchedule数据在迭代内部循环的同时处于范围内。所以我制定了一个更基本的例子来看看。

我读过有关这不少东西,但无法找到一个解决方案。我试过一百万种方法,但没有任何效果。我试过rootScope,$父,广播,制定者&干将,设置人,然后通过功能调用内环代码,等等,等等

用我的表,我试过设置范围的weekScedule通过ng-init ng-init。还有一个'使用'day.weekSchedule = person.weekSchedule'的子范围ng-init。通过这种方式,它可以将对象获取到视图模板的范围内,但仅限于最后一个对象。因此,第一个外迭代中的对象具有错误的对象。

<table width="100%" border="1"> 
    <tr ng-repeat="person in scheduleData"> 
     <th ng-init="setWeekSchedule(person.weekSchedule)">{{person.name}}</th> 
     <!-- th>{{person.name}}</th --> 
     <!-- td width="12%" ng-repeat="day in dayNumbers" ng-model="person.weekSchedule" --> 
     <td width="12%" ng-repeat="day in dayNumbers"> 
      <span ng-init="day.weekSchedule=person.weekSchedule"></span> 
      day.id: {{day.id}}<br /> 
      1st schedule id: {{day.weekSchedule[0].id}} 
     </td> 

    </tr> 
</table> 


$scope.dayNumbers = [{id:1},{id:2},{id:3},{id:4},{id:5},{id:6},{id:7}]; 

$rootScope.person = { 
    weekSchedule: [{ id: 0 }] 
}; 

$rootScope.setWeekSchedule = function(weekSchedule) {  
    $rootScope.person.weekSchedule = weekSchedule; 
}; 

$scope.dayNumbers.forEach(function(day){ 
    day.weekSchedule = $rootScope.person.weekSchedule; 
    console.log('day.id: ' + day.id); 
    console.log('1st schedule id: ' + day.weekSchedule[0].id); 
}); 

$scope.scheduleData = [ 
    {"id":"1","name":"Jim","weekSchedule":[ 
    {"id":"1001","dow":"1","scheduleDate":"01/08/2016"}, 
    {"id":"1002","dow":"2","scheduleDate":"01/09/2016"}, 
    {"id":"1003","dow":"4","scheduleDate":"01/11/2016"}, 
    {"id":"1004","dow":"5","scheduleDate":"01/12/2016"}]}, 
    {"id":"1","name":"Kim","weekSchedule":[ 
    {"id":"1005","dow":"2","scheduleDate":"01/09/2016"}, 
    {"id":"1006","dow":"3","scheduleDate":"01/10/2016"}, 
    {"id":"1007","dow":"5","scheduleDate":"01/12/2016"}, 
    {"id":"1008","dow":"6","scheduleDate":"01/13/2016"}]} 
]; 

enter image description here

无论我如何在控制器设定的时间表,我不能正确地查看迭代访问它。无论我如何在视图中设置时间表,我都无法在控制器中正确访问(并处理)它。

回答

0

创建建立一个交叉引用的功能。

$scope.xref = function(schedule) { 
    var xref = {}; 
    angular.forEach(schedule, function(entry) { 
     xref[entry.dow] = entry; 
    }); 
    return xref; 
}; 

在模板中使用该函数。

<td width="12%" ng-repeat="day in dayNumbers"> 
    day.id: {{day.id}}<br /> 
    1st schedule id: {{xref(person.weekSchedule)[day.id].id}} 
</td> 

DEMO on JSFiddle

+0

辉煌,良好的工作,THX。毫无进展后,我参加了一个更简单的方法,丢弃“dayNumbers.forEach”的阴影中NG重复和刚刚通过了“day.id”和“时间表”成一个函数,循环的时间表,以找到匹配并设置计划为'日'属性,然后我可以在视图中访问它们。所以现在我想知道哪个更有效,因为外部参照循环每个时间表为每个属性,我的新方法循环一次。我需要一个混合体,我可以将外部参照的obj设置为日期属性,因此每天只会调用一次迭代。所以我现在在想这个。 – bobvan

+0

这个例子效率不高,因为它在每次迭代中构建外部参照。理想情况下,应该在获取数据并根据需要进行更新时构建外部参照。但这是如何快速构建外部参照的一个很好的例子。它很快解决了问题 – georgeawg

+0

是的,我想出了如何调用一次。最大的问题是我有一个foreach绑定并且平行或阴影内部ng-repeat的地方;我在一个例子中看到的东西,并认为我可以使用。放弃之后,事情变好了。 “日程”的obj已经不仅仅是一个道或日期多个属性,但我在这里减少到一个更基本的例子。现在我的'td'使用ng-init将xref obj设置为'schedule',在'td'中我可以输出任何我想要的属性: Thx George。 – bobvan