1

我让用户上传表格数据,然后我允许他们在它被插入之前对其进行解析。

例如,一位用户可能会上传:

ID, NAME, PASSWORD, ADDRESS, EMAIL
10, Tim, foo, 123 S Main, tim@mailinator.com
11, Withers, foo, 123 S Main, tim@mailinator.com
//ETC//

另一个用户可能会以不同的方式格式化他们的数据:

FIRST_NAME, LAST_NAME, ID, PASSWORD, EMAIL
Tim, Withers, 10, 123, tim@mailinator.com
//You get the idea...

我的应用程序获取数据并允许用户在最终上传到服务器之前指定哪些列具有必要的信息:

Column 0 => ID
Column 4 => Email
Column 2 => Password

我想使用 aselect来限制用户输入:

Which column is the First Name? 
<select 
    ng-options="k as k for (k,v) in uploadData.row[0]" 
    ng-model="columnData.firstName">
</select>

这很好用,但如果它们有超过 9 列,则选择框如下所示:

0
1
10
11
12
13
2
3
4
5
6
7
8
9

如何确保它连续显示 1-13?是否有另一种方法可以创建带有特定长度选项的选择?

编辑:摆弄问题:http: //jsfiddle.net/aBccw/204/

4

4 回答 4

5

角度文档解释说,您使用的理解表达式 ( label for (key , value) in object) 适用于对象数据源。这就是为什么它将索引作为字符串而不是整数来处理的原因。

您应该尝试使用以下索引:

<select ng-model="selected" ng-options="friends.indexOf(v) for v in friends">

这是您更新的小提琴。

于 2013-10-10T13:45:45.503 回答
2

使用 ng-repeat over optiontag 为选择框生成选项是完全可以的。使用ngRepeat至少有两种方法可以满足您的要求。

使用(key, value) in expression

<select ng-model="selected">
  <option ng-repeat="(key, friend) in friends" value="{{key}}">{{key}}</option>
</select>

使用$indexngRepeat 迭代器的属性

<select ng-model="selected">
  <option ng-repeat="friend in friends" value="{{$index}}">{{$index}}</option>
</select>

由于ngRepeat迭代器是从零开始的,因此这两个示例将产生 0-12 范围内的选项。要使其显示选项 1-13,您只需+1在每次迭代中添加:

<option ng-repeat="(key, friend) in friends" value="{{key+1}}">{{key+1}}</option>

或者

<option ng-repeat="friend in friends" value="{{$index+1}}">{{$index+1}}</option>
于 2013-10-10T17:50:44.260 回答
2

您需要一个过滤器来对它们进行排序。我更新了你的小提琴

现在ng-options是:

<select ng-model="selected" ng-options="id for id in friends|sortKeyIds"></select> 

我添加了过滤器(我必须将你的控制器放在一个模块中才能添加过滤器)。我确信有更好的方法来提取和过滤这个密钥(如果我没有被困在小提琴中,我会使用 underscore.js)。

app.filter('sortKeyIds', function() {
    return function(input) {
        var keys = angular.forEach(input, function(value, key) {
            return parseInt(key);
        });
        keys.sort(function(a, b) {
            return a - b;
        });
        return keys;
    }
});
于 2013-10-11T11:58:56.730 回答
0

您可以使用现有过滤器本身按整数排序,如下所示使用 parseInt 。

ng-options="o as o.id  for o in products | orderBy:'parseInt(id)' track by o.id"
于 2016-05-04T17:57:42.987 回答