ブートストラップ「ボタングループ」と統合するための小さな角度モジュールを作成しました(ラジオボタンのように機能させるためのJavaScriptを少し追加しました。チェックボックスに対して同じことを行うために、このモジュールで作成しました:http://jsfiddle .net/evaneus/z9rge/
私のコードはhttp://jsfiddle.net/askbjoernhansen/YjMMD/にあります
私の質問:
1)これは正しいアプローチですか?
2) モデルは 3 回監視されますか、それとも $scope.$watch() は同じモデルであると判断して 1 回だけ監視しますか? そのようです。
3) 私のように $watch 関数で DOM をいじるのは「正しい」でしょうか? 「汚い」と感じますが、それは、angularjs とネイティブに互換性がないものに angular を追加するときに求めていることだと思います。または?
4) 各ボタンの代わりに btn-group に ng-model 属性を配置する方法はありますか? それはそれをもっときれいに見せるでしょう。
上記のjsfiddleで確認できます。または、コードはここにあります。最初はhtmlです。
<!-- to test the two-way model -->
<input name="test" type="radio" ng-model="myModel['A']" value="left"> Left<br>
<input name="test" type="radio" ng-model="myModel['A']" value="middle"> Middle<br>
<input name="test" type="radio" ng-model="myModel['A']" value="right"> Right<br>
myModel A {{myModel['A']}}<br/>
<div class="btn-group" data-toggle="buttons-radio">
<button type="button" buttons-radio=""
ng-model="myModel['A']" value="left" class="btn">Left</button>
<button type="button" buttons-radio=""
ng-model="myModel['A']" value="middle" class="btn">Middle</button>
<button type="button" buttons-radio=""
ng-model="myModel['A']" value="right" class="btn">Right</button>
</div>
そしてJavaScript:
angular.module('buttonsRadio', []).directive('buttonsRadio', function() {
return {
restrict: 'A',
require: 'ngModel',
link: function($scope, element, attr, ctrl) {
element.bind('click', function() {
$scope.$apply(function(scope) {
ctrl.$setViewValue(attr.value);
});
});
// This should just be added once, but is added for each radio input now?
$scope.$watch(attr.ngModel, function(newValue, oldValue) {
element.parent(".btn-group").find('button').removeClass("active");
element.parent(".btn-group")
.find("button[value='" + newValue + "']").addClass('active');
});
}
};
});