选择框中的角度,布尔值


70

我想使用选择将布尔值设置为true或false,这是我的代码:

<select class="span9" ng-model="proposal.formalStoryboard">
<option value="false">Not Included</option>
<option value="true">Included</option>
</select>

值(proposal.formalStoryboard)正确设置为true或false,但是在已经分配了值之后,更改不会反映在选择框上。

我尝试了ng-value =“ true”和ng-value =“ false”而不只是值,但效果不佳。


ngValue对我来说效果很好(在Angular 1.6上进行了测试)<select ng-model="$ctrl.request.invoiced" class="form-control input-lg"> <option ng-value="undefined">All</option> <option ng-value="false">Not Invoiced</option> <option ng-value="true">Invoiced</option> </select>
Stefan Norberg

Answers:


86

编辑:评论员指出,我的原始解决方案无法按要求工作。我已经更新了答案,以反映以下其他人给出的正确答案(我无法删除接受的答案)。

对于Angular 1.0.6,请考虑以下HTML:

<div ng-app="">
  <div ng-controller="MyCntrl">
    <select ng-model="mybool"
            ng-options="o.v as o.n for o in [{ n: 'Not included', v: false }, { n: 'Included', v: true }]">
    </select>
    <p>
        Currently selected: <b>{{ mybool }}</b> opposite: {{ !mybool }}
   </p> 
 </div>
</div>

而这个JavaScript:

function MyCntrl($scope) {
    $scope.mybool = true;
}

这是一个工作DEMO的角度1.0.6,这里是一个工作DEMO的角度1.3.14,这是稍有不同。


克里斯,您好,我已经开始工作了,我在问题
中用

@Jerome Ansia:请参阅sza的评论/答案。您还没有发布引起您问题的任何信息。此代码有效。
ChrisP

哦,给我几分钟,我要检查一下;)
Jerome Ansia

@JeromeAnsia,您使用ng-repeat或自定义指令在元素内发布的代码吗?我猜<select>存在存在于不同的范围。
ChrisP

3
这实际上是行不通的。我已经更新了您的jsfiddle来显示相反的内容:jsfiddle.net/jGfL5/14这实际上将值设置为字符串“ true”或字符串“ false”,两者均评估为真。
Boushley,

58

就是这样:

<select ng-model="someModel" ng-options="boolToStr(item) for item in [true, false]">
</select>

并定义:

$scope.boolToStr = function(arg) {return arg ? 'Included' : 'Not included'};

1
很好的答案,唯一一个真正似乎可以解决问题中困难部分的答案
aw04

24
为了避免定义boolToStr,我已经NG-选项= “OV作为邻在[{N: '否',V:假},{N: '是',ν:真}]”
亚伦

顺便说一下,谢谢您的回答!IMO这是解决此问题的最佳方法。
亚伦

@Aaron对您来说这正常工作吗?我正在尝试(使用Angular 1.3),尽管它可以正确显示,但是如果内联var声明,我的堆栈跟踪中会出现一个巨大错误。如果我在控制器中定义了一个options数组并对其进行循环,则可以正常工作。想知道您是否有相同的问题。
Eric B.

@EricB。它对我来说有效,没有错误打印,并且我正在使用v1.3.0-beta.2。如果您可以在plunkr中重现该问题,那么我会帮助您进行调试。
亚伦

34

为什么不只使用它呢?

<select class="form-control" ng-options="(item?'Included':'Not Included') for item in [true, false]"></select>

2
真好 根据需要将布尔值(不是字符串)存储在模型中,并且全部存储在一行中。确实不需要指令或辅助函数。
joeytwiddle

9

如果您使用的是angularjs版本>= 1.2.0,则可以访问该指令ng-value

您可以使用ng-valueon选项元素。您的html会像这样工作。

<select ng-model="proposal.formalStoryboard">
    <option ng-value="true">Included</option>
    <option ng-value="false">Not Included</option>
</select>

它还适用于收音机和复选框。


3
这是最简单的答案。确认截至2018
Felipe

简单又简单
Nitsan Baleli

那应该被接受,或者至少是最投票赞成的答案!
Nikzin

我感谢投票。看起来ngValue仅在1.2.0版中可用,因此可以理解为什么它不是公认的答案
Kieran

2

我建议为此使用指令。像往常一样,我尝试远离超时和其他异步操作,而不希望使用更具权威性和直接的控制权。

directives.directive('boolean', function() {
  return {
    priority: '50',
    require: 'ngModel',
    link: function(_, __, ___, ngModel) {
      ngModel.$parsers.push(function(value) {
        return value == 'true' || value == true;
      });

      ngModel.$formatters.push(function(value) {
        return value && value != 'false' ? 'true' : 'false';
      });
    }
  };
});

优先级是专门设置的,因此优先于其他任何指令(通常没有设置优先级,默认为 0

例如,我将此指令(用于true / false选择)与selectpicker将我的select元素包装在selectpickerbootstrap插件使用。

编辑:

需要说明的是,我忘记提及的是,您的html值必须是字符串值。该指令的作用是在视图和模型之间转换,使模型值保持不变,boolean而视图则采用以下string格式:

%select.selectpicker{ ng: { model: 'modelForm.listed' }, selectpicker: '{ }', boolean: true }
  %option{ value: 'true' } Listed
  %option{ value: 'false' } Unlisted

2

这也将起作用。只需通过为该值放置一个角度表达式来强制该值是布尔值即可。

<select class="span9" ng-model="proposal.formalStoryboard">
    <option value="{{false}}" 
           ng-selected="proposal.formalStoryboard === false">
           Not Included
    </option>
    <option value="{{true}}"
            ng-selected="proposal.formalStoryboard === true">
            Included
    </option>
</select>

它对我有用,但是ng模型的值具有字符串类型。在我的变体之后,我有了SignalR,它为c#创建了布尔类型,但是在许多情况下,它不能解决问题。
КонстантинЗолин

1

我创建的样本给你,请检查出来。

您要使用模型来驱动ui绑定吗?

<div ng-app ng-controller="Ctrl">
    <select class="span9" ng-model="proposal.formalStoryboard">
        <option value="false">Not Included</option>
        <option value="true">Included</option>
    </select>
    <button ng-click="changeValue();">Click</button>
<div>

function Ctrl($scope) {
    $scope.proposal = {};
    $scope.proposal.formalStoryboard = true;

    $scope.changeValue = function () {
        $scope.proposal.formalStoryboard = !$scope.proposal.formalStoryboard;
        console.log($scope.proposal.formalStoryboard);
    }
}

3
您的示例有一个细微的错误。使用select选择值时,它将设置字符串。这样,如果将选择框更改为不包含,则单击“单击”按钮,该值将保持不变。这是因为它已从字符串“ false”变为值false。
Boushley 2013年

0

对于这个令人沮丧的问题,我几乎没有成功。我的解决方案虽然不是很优雅,因为它是另一行代码,但每次都会解决。这可能不适用于每个应用程序。

$scope.myObject.myBooleanProperty = $scope.myObject.myBooleanProperty.toString();

在尝试将其重新绑定到页面上显示的模型之前,将其转换为“真实”字符串可以使其正确选择值。


0

Angular在绑定到ng-model的值和给定Options中的Values之间进行了严格的比较。初始问题中给出的值是字符串“ false”和“ true”。如果ng-model的值的类型为bool且定义为{“ Value”:false},则Angulars strict === string和bool之间的比较不匹配,因此选择框为空。

真正的问题是-如果选择一个值,则类型从bool更改为字符串({“ Value”:false}-> {“ Value”:“ false”})会导致错误(如果回发)。

对我来说,这两个问题的最佳解决方案就是本帖子中的Thiago Passos。(https://stackoverflow.com/a/31636437/6319374


-3
<script type='text/javascript'>
function MyCntrl($scope) {<!--from   ww w . j  a  v a 2s.  c om-->
  $scope.mybool = true;
}

</script>
</head>
<body>
  <div ng-app="">
  <div ng-controller="MyCntrl">
    <select ng-model="mybool">
        <option value="false">Not Included</option>
        <option value="true">Included</option>
    </select>
    <p>
    Currently selected: {{ mybool }}
   </p>
 </div>
</div>
</body>
</html>

这不是解决问题的方法,实际上在原始问题中引入了相同的问题。
Bruno Finger'7
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.