使用带有 ng-repeat 的 angular 日期选择器

Using the angular datepicker with ng-repeat

我正在尝试编写一些东西,让我可以编辑其中包含日期的记录,我的 table:

中有这个
        <tr ng-repeat="event in eventFixtures track by $index">
            <td>{{event.date | date: 'dd/MM/yyyy'}}</td>
            <td>
                <div class="row">
                    <div class="col-md-6">
                        <p class="input-group">
                            <input type="text"
                                   class="form-control"
                                   ng-model="event.date"
                                   is-open="fixture{{$index}}popup"
                                   ng-click="openFixturePopup($index)"/>
                        </p>
                    </div>
                </div>
            </td>
        </tr>

然而,当我点击其中一个输入框时,日期选择器没有出现。

开启功能在这里:

$scope.openFixturePopup = function(fixture) {
    $scope["fixture"+fixture+"popup"] = true;
};

变量是这样定义的:

    for(var i = 0; i < data.length; i++) {
        $scope["fixture"+i+"popup"] = false;
    }

从在 table 上方打印出变量的值开始,它们正在被更改,如果我创建一个链接到特定夹具弹出窗口的输入,例如像这样:

<div class="row">
    <div class="col-md-6">
        <p class="input-group">
            <input type="text"
                   class="form-control"
                   uib-datepicker-popup="{{format}}"
                   ng-model="testDate"
                   is-open="fixture0popup"
                   ng-click="openFixturePopup(0)"/>
        </p>
    </div>
</div>

它工作正常。

有人知道是什么原因造成的吗?

我有一种预感,试图对变量名使用插值是导致失败的原因。我尝试了很多方法,例如 $scope[dynamicVarName]$scope.$eval([dynamicVarName]) 等,但都无济于事。我不能肯定地说这是你的问题,但我想我找到了一个你可以尝试的解决方案。

在你的事件上设置一个 isOpen 标志并查看它,而不是为状态创建一堆范围变量。这也是有利的,因为如果索引发生变化,打开状态会随数组元素一起移动,因此您获得无效状态的可能性较小。

代码可能如下所示:

var app = angular.module("myApp", [])
.controller("myCtrl", function ($scope) {
  $scope.eventFixtures = [
    {name: "1", date: "1-1-01"},
    {name: "2", date: "2-2-02"},
    {name: "3", date: "3-3-03"},
    {name: "4", date: "4-4-04"},
    {name: "5", date: "5-5-05"}
  ];
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" ng-controller="myCtrl">
  <table>
    <tr ng-repeat="event in eventFixtures track by $index">
      <td>{{event.date | date: 'dd/MM/yyyy'}}</td>
      <td>
        <div class="row">
          <div class="col-md-6">
            <p class="input-group">
              <input type="text"
                     class="form-control"
                     ng-model="event.date"
                     is-open="{{event.isOpen}}"
                     ng-blur="event.isOpen = false;"
                     ng-focus="event.isOpen = true;"/>
              isOpen? {{event.isOpen || false}}
            </p>
          </div>
        </div>
      </td>
    </tr>
  </table>
</div>