【问题标题】:How to bind <select> ng-model using ng-options inside a ng-repeat如何在 ng-repeat 中使用 ng-options 绑定 <select> ng-model
【发布时间】:2017-11-18 01:23:58
【问题描述】:

我有一个list 的任务:

[{
    Titel: "Title1",
    Position: "9"
},{
    Titel: "Title2",
    Position: "1"
},{
    Titel: "Title3",
    Position: "5"
},{
    Titel: "Title4",
    Position: "7"
}]

我正在尝试创建&lt;select&gt;list,其中每个都是list.lenght 长并且具有选定的值。 html sn-p:

<table cellpadding="0" cellspacing="0" border="0">  
    <tr>
        <td class="ms-authoringcontrols"><b>Title</b></td>
        <td class="ms-authoringcontrols"><b>Position</b></td>
    </tr>
    <tr ng-repeat="t in tasks">
        <td>
            <a href="TODO">{{t.Titel}}</a>
        </td>
        <td>
            <select ng-model="t.Position" ng-options="t.Position as tasks.indexOf(i)+1 for i in tasks"></select>
        </td>
    </tr>
</table

输出:

缺少的是每个&lt;select&gt; 的选定值(位置)。我知道值是通过定义 ng-model 设置的,ng-model="t.Position" 是错误的,但是如何将每个项目的Position 值设置为其相关的select 元素?每个select&lt;option&gt; 应该是任务的长度,从1 到n 排序。

【问题讨论】:

  • 你想用 select 改变数组的顺序吗?还是只是 Position 属性?
  • 我只想将 Position 属性设置为选择框

标签: javascript angularjs angularjs-ng-repeat angular-ngmodel angularjs-ng-options


【解决方案1】:

您非常接近,您要查找的ngOptions 格式是select as label for value in array,其中select 是将分配给模型的值。

在你的情况下,Position 是字符串,所以我们也需要将select 转换为字符串,以便它与模型匹配:

ng-options="(tasks.indexOf(i)+1).toString() as tasks.indexOf(i)+1 for i in tasks"
            ^ model value                      ^ display

tasks.indexOf(i)+1+'' 也可以)

angular
  .module('Test', [])
  .controller('TestCtrl', function($scope) {
    $scope.tasks = [{
          Titel: "Title1",
          Position: "9"
      },{
          Titel: "Title2",
          Position: "1"
      },{
          Titel: "Title3",
          Position: "3"
      },{
          Titel: "Title4",
          Position: "2"
      }];
  });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="Test" ng-controller="TestCtrl">
  <table cellpadding="0" cellspacing="0" border="0">  
      <tr>
          <td class="ms-authoringcontrols"><b>Title</b></td>
          <td class="ms-authoringcontrols"><b>Position</b></td>
      </tr>

      <tr ng-repeat="t in tasks">
          <td>
              <a href="TODO">{{t.Titel}}</a>
          </td>
          <td>
              <select ng-model="t.Position" ng-options="(tasks.indexOf(i)+1).toString() as tasks.indexOf(i)+1 for i in tasks"></select>
          </td>
      </tr>
  </table>
  <pre>{{tasks|json}}</pre>
</div>

(如果你运行 sn -p 你会注意到第一个不是 选中,那是因为 [1,2,3,4] 不包含 9。)

【讨论】:

    【解决方案2】:

    如果您想更改项目的顺序,您需要跟踪单独数组中的位置。

    这是一个工作示例

    angular.module("app", []).controller("myCtrl", function($scope){
    $scope.tasks =  [{
        Titel: "Title1",
        Position: "9"
    },{
        Titel: "Title2",
        Position: "1"
    },{
        Titel: "Title3",
        Position: "5"
    },{
        Titel: "Title4",
        Position: "7"
    }];
    $scope.positions = ["1","2","3","4","5","6","7","8","9"];
    });
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    
    <div ng-app="app" ng-controller="myCtrl">
      <table cellpadding="0" cellspacing="0" border="0">  
        <tr>
            <td class="ms-authoringcontrols"><b>Title</b></td>
            <td class="ms-authoringcontrols"><b>Position</b></td>
        </tr>
        <tr ng-repeat="t in tasks | orderBy: 'Position'">
            <td>
                <a href="TODO">{{t.Titel}}</a>
            </td>
            <td>
                <select ng-model="t.Position" ng-options="i for i in positions"></select>
            </td>
        </tr>
    </table>
    </div>

    【讨论】:

    • 我不是在寻找任务的顺序,Position 是每个&lt;select&gt; 应该选择的值。但是,如果每个选择框都有从 1 到 n 的排序值,那么您的示例就可以了
    • 是的,但即使没有第二个数组,也必须有办法做到这一点,在您的示例中为 $scope.positions
    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 2013-01-02
    相关资源
    最近更新 更多