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" 而不仅仅是 value,但效果不佳。

4

10 回答 10

90

编辑:评论员指出我原来的解决方案没有像声称的那样工作。我已经更新了答案以反映下面其他人给出的正确答案(我无法删除已接受的答案)。

对于 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;
}

这是Angular 1.0.6 的有效DEMO和 Angular 1.3.14 的有效DEMO,两者略有不同。

于 2013-07-19T19:52:52.707 回答
59

这样做:

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

并定义:

$scope.boolToStr = function(arg) {return arg ? 'Included' : 'Not included'};
于 2013-08-08T14:40:47.577 回答
34

为什么不直接使用这个?

<select class="form-control" ng-options="(item?'Included':'Not Included') for item in [true, false]"></select>
于 2015-07-26T11:27:54.883 回答
14

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

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

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

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

于 2017-12-21T22:14:59.277 回答
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

例如,我将此指令(用于真/假选择)与我的selectpicker指令一起使用,该指令将我的元素包装selectselectpicker引导插件中。

编辑:

这里需要注意的是,我忘记提及的是,您的 html 值必须是字符串值。该指令所做的是在视图和模型之间进行转换,将模型值保存在格式中,boolean并将视图保存在string格式中:

%select.selectpicker{ ng: { model: 'modelForm.listed' }, selectpicker: '{ }', boolean: true }
  %option{ value: 'true' } Listed
  %option{ value: 'false' } Unlisted
于 2015-10-29T04:43:32.787 回答
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>
于 2017-08-18T20:03:29.773 回答
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);
    }
}
于 2013-07-19T19:56:34.063 回答
0

我在这个令人沮丧的问题上收效甚微。我的解决方案虽然不是太优雅,因为它是一行额外的代码,但每次都解决了。这可能不适用于每个应用程序。

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

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

于 2015-02-09T01:02:47.983 回答
0

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

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

对我来说这两个问题的最佳解决方案是这篇文章中的蒂亚戈·帕索斯(Thiago Passos)。(https://stackoverflow.com/a/31636437/6319374

于 2016-05-11T13:09:04.293 回答
-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>
于 2015-04-28T04:47:19.807 回答