私はここでコードを選択してブール値を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"を試しましたが、うまくいきません。
EDIT:コメンテーターは、私の元のソリューションが主張どおりに機能しなかったことを指摘しました。回答を更新して、以下の他のユーザーからの正しい回答を反映させました(受け入れられた回答を削除することはできません)。
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 [〜#〜] for Angular 1.0.6そして、動作する [〜#〜] demo [〜#〜] for Angular 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>
angularこれがサポートされるようになったバージョンはわかりませんが、ng-value
オプション要素。あなたのhtmlはこのように機能します。
<select ng-model="proposal.formalStoryboard">
<option ng-value="true">Included</option>
<option ng-value="false">Not Included</option>
</select>
また、ラジオとチェックボックスでも機能します。
サンプルを作成しました。 this outを確認してください。
モデルを使用して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);
}
}
これにはディレクティブを使用することをお勧めします。いつものように、より信頼性の高い直接的な制御を優先して、タイムアウトやその他の非同期操作を避けようとします。
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
bootstrapプラグイン内のselect
要素をラップするselectpicker
ディレクティブで、このディレクティブを(true/false選択に対して)使用します。
編集:
ここで注意することは、私が言及するのを忘れていましたが、html値は文字列値である必要があるということです。ディレクティブが行うことは、ビューとモデルの間で変換し、モデル値をboolean
に、ビューをstring
形式に保持することです:
%select.selectpicker{ ng: { model: 'modelForm.listed' }, selectpicker: '{ }', boolean: true }
%option{ value: 'true' } Listed
%option{ value: 'false' } Unlisted
これも機能します。値にangular式を入力することにより、値を強制的にブール値にします。
<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>
Angularは、ng-modelへの値のバインドと、指定されたオプションの値との厳密な比較を行います。最初の質問で指定される値は、ストリング「false」および「true」です。 ng-modelの値がbool型で、{"Value":false}のように定義されている場合、Angulars strict === stringとboolの比較は一致しないため、select-boxは空です。
実際の問題は、値を選択すると、タイプがブールから文字列に変更された場合({"Value":false}-> {"Value": "false"})、ポストバックするとエラーが発生する可能性があることです。
私にとっての両方の問題に対する最善の解決策は、この投稿のチアゴ・パッソスのものでした。 ( https://stackoverflow.com/a/31636437/6319374 )
私はこのイライラする問題でほとんど成功しませんでした。私のソリューションは、追加のコード行なのでエレガントではありませんが、毎回解決しました。これはすべてのアプリケーションで機能するとは限りません。
$scope.myObject.myBooleanProperty = $scope.myObject.myBooleanProperty.toString();
ページに表示されているモデルに再バインドしようとする前に、それを「実際の」文字列に変えることで、値を正しく選択することができました。