ng-select 只给出字符串,但我想要一个整数

Posted

技术标签:

【中文标题】ng-select 只给出字符串,但我想要一个整数【英文标题】:ng-select gives only string, but I want an integer 【发布时间】:2013-11-17 13:12:45 【问题描述】:

这是我的 Angular html 文件代码。在我的 mongo 数据库中 frequencyType 添加为 frequencyType = "1",但我想要 frequencyType = NumberInt(1);

<div class="span4">
  <select class="span12 combobox" ng-model="frequencyType" required>
    <option value="1">Daily</option>
    <option value="2">Weekly</option>
    <option value="3">Monthly</option>
    <option value="4">Yearly</option>
  </select>
</div>

我进入了我的数据库frequencyType = "1",但我想要frequencyType = NumberInt(1)

【问题讨论】:

请重新考虑您选择的答案,因为它只是部分正确。正如 Trak 在他的回答中提到的那样,accepted 答案不适用于他的回答 确实 有效的情况。当像我这样的另一个人出现时,我宁愿看到选择的“最正确”的答案。幸运的是,我不会从表面上看任何东西,否则我会发现“答案”对我不起作用的艰难方式。 :) 【参考方案1】:

这里讨论的大多数解决方案都需要使用 ngOptions 指令,而不是在 HTML 代码中使用静态 &lt;option&gt; 元素,就像 OP 代码中的情况一样。

Angular 1.6.x

编辑如果您使用 Angular 1.6.x,只需使用 ng-value 指令,它将按预期工作。

angular.module('nonStringSelect', [])
.run(function($rootScope) 
  $rootScope.model =  id: 2 ;
)
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.0/angular.min.js"></script>
<div ng-app="nonStringSelect">
  <select ng-model="model.id">
    <option ng-value="0">Zero</option>
    <option ng-value="1">One</option>
    <option ng-value="2">Two</option>
  </select>
  
   model 
</div>

旧版本

一种方法可以让它在仍然使用静态元素的同时工作。它显示在 AngularJS 选择指令文档中。

这个想法是使用指令在模型上注册解析器和格式化程序。当项目被选中时,解析器将进行字符串到整数的转换,而当模型发生变化时,格式化程序将进行整数到字符串的转换。

下面的代码(直接取自 AngularJS 文档页面,不是我的功劳)。

https://code.angularjs.org/1.4.6/docs/api/ng/directive/select#binding-select-to-a-non-string-value-via-ngmodel-parsing-formatting

angular.module('nonStringSelect', [])
.run(function($rootScope) 
  $rootScope.model =  id: 2 ;
)
.directive('convertToNumber', function() 
  return 
    require: 'ngModel',
    link: function(scope, element, attrs, ngModel) 
      ngModel.$parsers.push(function(val) 
        return parseInt(val, 10);
      );
      ngModel.$formatters.push(function(val) 
        return '' + val;
      );
    
  ;
);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<div ng-app="nonStringSelect">
  <select ng-model="model.id" convert-to-number>
    <option value="0">Zero</option>
    <option value="1">One</option>
    <option value="2">Two</option>
  </select>
  
   model 
</div>

【讨论】:

很好的解决方案!这应该是公认的答案。 +1 找了很久,这个很完美! 这对于 AngularJS 1.6+ 来说绝对是一个更实用的解决方案,因为 ng-options 可能由于严格比较而出现问题。【参考方案2】:

这是迄今为止我发现的最简单的方法:

function Controller($scope) 
    $scope.options = 
        "First option" : 1,
        "Second option" : 2,
        "Last option" : 10
    
    $scope.myoption = 2;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app ng-controller="Controller">    
    <select ng-model="myoption" ng-options="label for (label, value) in options"></select>
    Option Selected: myoption
</div>

或者,如果你想使用数字索引:

function Controller($scope) 
    $scope.options = 
        1 : "First option",
        2 : "Second option",
        10 : "Last option"
    
    $scope.myoption = 2;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app ng-controller="Controller">    
    <select ng-model="myoption" ng-options="value*1 as label for (value, label) in options"></select>
    Option Selected: myoption
</div>

对于 Angular 2,follow the rabit...

【讨论】:

【参考方案3】:

我认为这样做的角度方法是在选择标记中使用指令“convert-to-number”。

<select class="span12 combobox" ng-model="frequencyType" required convert-to-number>
    <option value="1">Daily</option>
    <option value="2">Weekly</option>
    <option value="3">Monthly</option>
    <option value="4">Yearly</option>
</select>

您可以在页面末尾查看文档和小提琴:https://docs.angularjs.org/api/ng/directive/select

【讨论】:

【参考方案4】:

我刚刚遇到了同样的问题,并找到了正确的方法——不需要“魔法”。 :)

function MyCtrl($scope) 
    $scope.values = [
        name : "Daily", id : 1,
        name : "Weekly", id : 2,
        name : "Monthly", id : 3,
        name : "Yearly", id : 4];
    $scope.selectedItem = $scope.values[0].id;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.min.js"></script>
<div ng-app ng-controller="MyCtrl">
    <select ng-model="selectedItem" ng-options="selectedItem.id as selectedItem.name for selectedItem in values"></select>
    selectedItem: selectedItem
</div>

【讨论】:

这是正确答案,忘记其他解决方案 这对我有用,在逻辑上似乎是正确的答案。配置很容易理解,Angular 文档支持 ng-options 语法。【参考方案5】:

有一个更简单的方法:

只需使用value*1 作为您的 id,这会将字符串转换为 int 而不会更改值...假设 id 是整数。

所以结果是>

<div ng-app ng-controller="MyCtrl">
    <select ng-model="selectedItem" ng-options="selectedItem*1 as selectedItem for selectedItem in values"></select>
    selectedItem: selectedItem
</div>

这将在更多情况下起作用,因为 indexOf 在对象中不可用,仅在数组中可用。此解决方案适用于以整数作为键的对象(例如,如果缺少某些键,或者如果您使用 db id)

【讨论】:

但是如果它不是一个整数呢?一般来说,假设是不好的;-) 该问题询问作为整数的键,如果它不是整数,并且它是一个字符串,那么正在做出更多假设,因为您信任数据源的顺序 比添加转换指令解析更好(***.com/questions/28114970/…) 我认为“+selectedItem”更好一些,但效果一样【参考方案6】:

我建议你尝试使用indexOf

JS

function MyCtrl($scope) 
    $scope.values = ["Daily","Weekly","Monthly","Yearly"];
    $scope.selectedItem = 0;

HTML

<div ng-app ng-controller="MyCtrl">
    <select ng-model="selectedItem" ng-options="values.indexOf(selectedItem) as selectedItem for selectedItem in values"></select>
    selectedItem: selectedItem
</div>

演示Fiddle

所以发送到mongoDB $scope.selectedItem

【讨论】:

这对我帮助很大。这似乎很简单,但我已经花了半个多小时了:( 当您的值是特定代码或 ID 时,这不起作用。以下 Trak 的解决方案适用于所有数值。 @Erwin 你想用我的演示举个例子吗?如果我输入 [1,2,3,4,5]; 它仍然有效 @MaximShoustin 我有一个具有值和描述字段的对象列表,其中 ng-options="code.value 作为 object.codes 中代码的 code.discription" 和 ng-model="codeField ”。 codeField 需要存储代码的值,不等于索引。当我使用“object.codes.indexOf(code)”时,它会将索引存储在应该填充代码的字段上。 如果 ID 是 [32,12,44,1,900] 怎么办?如果仅按索引选择,则此方法有效。我认为对于总是从 0 开始的枚举来说,这是一个很好的解决方案

以上是关于ng-select 只给出字符串,但我想要一个整数的主要内容,如果未能解决你的问题,请参考以下文章

ng-selected 在选择元素中不起作用

ng-selected不在select元素中工作

Angular TestBed:无法绑定到“ngModel”,因为它不是“ng-select”的已知属性

Python netifaces给出了两个地址

在 JavaScript 中如何使用整数添加字符串? [复制]

音频波形到整数序列