1

使用 ng-repeat 时,我应该如何在其中使用控制器?

例如,如果我在一周内循环一组天:

<ul ng-controller="WeekCtrl">
    <li ng-repeat="d in days">
        <span ng-controller="DayCtrl">
            {{dayOfWeek}} {{date}}: {{info}}
        </span>
    </li>
</ul>

但我DayCtrl想知道今天是哪一天d,所以必须把它拉出范围:

app.controller('DayCtrl', function($scope){
  $scope.date = $scope.d.date;
  $scope.dayOfWeek = 
    ['Mon','Tue','Wed','Thr','Fri','Sat','Sun']
    [$scope.d.date.getDay()];
  $scope.info = '... extra info...';
});

但这会在显示器和控制器之间产生依赖关系。理想情况下,我想d.date作为一个论点传入。

我可以编写一个指令+控制器并d.date作为属性传入。但这意味着我必须编写更多内容并将当天的 html 移动到单独的模板中,并且我不打算在其他地方使用 DayCtrl。

或者,我可以尝试使用<span ng-init="date=d.date">,但再次感觉很脏。

这样做的正确方法是什么。

Plunker 上的完整示例代码:http://plnkr.co/edit/wUxNFSEGjcDN7KlOLYdv显示了我在几天和几周内遇到的问题。

4

1 回答 1

2

对我来说,这似乎是一个指令的工作,d.date指定为一个属性。
我不知道如何info填充,但您的指令可能不需要控制器。

当天的 HTML 不必在单独的/指令模板中,它可以保留在 HTML 中:

 <li ng-repeat="d in days">
    <day date="d.date">
       {{dayOfWeek}} {{date}}: {{info}}
    </day>
 </li>

指示:

app.directive('day', function() {
  return {
    restrict: 'E',
    scope: { date: '=' },
    link: function(scope) {
     scope.dayOfWeek =  ['Mon','Tue','Wed','Thr','Fri','Sat','Sun'][scope.date.getDay()];
     scope.info = '... extra info...';
    }
  };
});

普朗克

仅供参考,如果您想使用 ng-init,可以将其包含在 ng-controller 中:

<span ng-controller="DayCtrl" ng-init="date=d.date">
于 2013-01-30T17:20:14.457 回答