我試圖建立一個自定義的複選框指令(能夠像我喜歡的樣式)不使用<input type="checkbox">
。它應該像人們期望的那樣工作;更新模型應該更新視圖,點擊框應該更新模型,它應該聽取required
指令(驗證應該工作)。自定義複選框指令的angularJS方式?
目前,我有以下指令,正好發揮預期:
'use strict';
angular.module('directives.checkbox', [])
.directive('checkbox', [function() {
return {
restrict: 'A',
require: 'ngModel',
replace: true,
template: '<span class="checkbox"></span>',
link: function (scope, elem, attrs, ctrl) {
elem.bind('click', function() {
scope.$apply(function() {
elem.toggleClass('checked');
ctrl.$setViewValue(elem.hasClass('checked'));
});
});
ctrl.$render = function() {
if (!elem.hasClass('checked') && ctrl.$viewValue) {
elem.addClass('checked');
} else if (elem.hasClass('checked') && !ctrl.$viewValue) {
elem.removeClass('checked');
}
};
}
}
}]);
這只是一個CSS類checkbox
併爲選中狀態另一個CSS類checked
一個<span>
。然而,使用jQuery來切換類並像我一樣更新視圖似乎並不像角度(或最佳實踐)。我寧願使用ng-class
和ng-click
指令,但這意味着我需要使用隔離範圍(以避免在同一頁上使用多個複選框時發生範圍狀態衝突)。出於某種原因,隔離示波器在ctrl
上使角度停止呼叫$render()
。
有誰知道這是否是正確的方法,或者如果有更像角度的方法,仍然可以解決我的要求?
我真的不明白我爲什麼被拒絕投票。我用一個例子提供了一個工作解決方案,而不使用angular和jquery。在任何情況下都應該以評論爲由反對投票。 – masimplo
我沒有讓你失望,但你的解決方案的問題是多個複選框不能在同一個頁面上,他們將共享'isChecked'範圍變量。 – joscarsson
嗨,謝謝你的評論。我沒有使用隔離範圍以防止增加混淆。我只是想演示如何在不使用jQuery的情況下操作dom。我現在已經更新了我的答案(和蹲伏者)以展示一個獨立的範圍。如果您不想綁定到外部作用域中的某個東西,綁定也是可選的。它也可以通過依賴ngModel值來完成。 – masimplo