簡體   English   中英

選擇框中的角度、布爾值

[英]Angular, boolean value in a select box

我想使用選擇將布爾值設置為 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,但它不起作用。

編輯:評論者指出,我原來的解決方案沒有像聲稱的那樣工作。 我已更新答案以反映以下其他人給出的正確答案(我無法刪除已接受的答案)。

對於 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,這是稍有不同。

只是這樣做:

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

並定義:

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

為什么不直接使用這個?

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

如果您使用的是 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>

它也適用於收音機和復選框。

我建議為此使用指令。 像往常一樣,我盡量遠離超時和其他異步操作,而傾向於更權威和直接的控制。

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指令一起使用,該指令將我的select元素包裝在selectpicker引導插件中。

編輯:

這里需要注意的是,我忘了提及,您的 html 值必須是字符串值。 該指令所做的是在視圖和模型之間進行轉換,將模型值保持為boolean ,將視圖保持為string格式:

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

這也會起作用。 只需通過為該值放置一個角度表達式來強制該值成為布爾值。

<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>

我創建的樣本給你,請檢查出來。

是你想用model來驅動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);
    }
}

我在這個令人沮喪的問題上幾乎沒有成功。 我的解決方案雖然不太優雅,因為它是額外的一行代碼,但每次都解決了。 這可能不適用於每個應用程序。

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

在嘗試將其重新綁定到頁面上顯示的模型之前將其轉換為“真實”字符串,可以使其正確選擇值。

Angular 在綁定到 ng-model 的值和給定選項中的值之間進行了嚴格的比較。 初始問題中給出的值是字符串“false”和“true”。 如果 ng-model 的值是類型 bool 並且定義為 {"Value":false} ,則字符串和 bool 之間的 Angulars 嚴格 === 比較永遠不會匹配,因此選擇框為空。

真正的問題是 - 如果您選擇一個值,則類型從 bool 更改為字符串 ({"Value":false} --> {"Value":"false"}) 如果回發可能會導致錯誤。

對我來說,這兩個問題的最佳解決方案是這篇文章中的 Thiago Passos 之一。 ( https://stackoverflow.com/a/31636437/6319374 )

<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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM