我创建了一个小的Angular模块,与Bootstrap中的"buttons-group"集成(加上一些javascript代码让它们像单选按钮一样工作)。我在这个模块的基础上创建了一个用于复选框的类似功能:http://jsfiddle.net/evaneus/z9rge/
我的代码在这里:http://jsfiddle.net/askbjoernhansen/YjMMD/
我的问题:
1)这是正确的方法吗?
2)模型会被监视三次,还是$scope.$watch()能够判断它是相同的模型并且只执行一次?看起来是这样的。
3)在$watch函数中混合DOM是否“正确”?感觉有点“不干净”,但是当我将Angular添加到原本不兼容AngularJS的东西时,这就是我要求的。或者说呢?
4)是否可以将ng-model属性放在btn-group上而不是每个按钮上?这将使它看起来更清洁。
您可以在我的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');
});
}
};
});