自定义复选框指令的angularJS方式?
我正在尝试构建一个自定义的checkbox指令(以便能够按照我喜欢的方式进行样式设置),而不是使用自定义复选框指令的angularJS方式?,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我正在尝试构建一个自定义的checkbox指令(以便能够按照我喜欢的方式进行样式设置),而不是使用。它应该像人们期望的那样工作;更新模型应该更新视图,单击该框应该更新模型,它应该听required指令(验证应该有效) 我目前有以下指令,完全按照预期工作: 'use strict'; angular.module('directives.checkbox', []) .directive('checkbox', [function () { return { restri
。它应该像人们期望的那样工作;更新模型应该更新视图,单击该框应该更新模型,它应该听required
指令(验证应该有效)
我目前有以下指令,完全按照预期工作:
'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');
}
};
}
}
}]);
“严格使用”;
angular.module('directions.checkbox',[])
.directive('复选框',[函数(){
返回{
限制:“A”,
要求:'ngModel',
替换:正确,
模板:“”,
链接:函数(范围、元素、属性、ctrl){
元素绑定('click',函数(){
作用域:$apply(函数(){
元素切换类(“选中”);
ctrl.$setViewValue(elem.hasClass('checked'));
});
});
ctrl.$render=函数(){
如果(!elem.hasClass('checked')和&ctrl.$viewValue){
元素addClass(“选中”);
}else if(elem.hasClass('checked')&&!ctrl.$viewValue){
元素移除类(“选中”);
}
};
}
}
}]);
它只是一个带有CSS类复选框的
,另一个CSS类已选中
用于选中状态。然而,使用jQuery来切换类和更新视图似乎并不像我所做的那样(或最佳实践)。我宁愿使用ng类
和ng click
指令,但这意味着我需要使用一个独立的作用域(以避免在同一页面上使用多个复选框时发生作用域状态冲突)。出于某种原因,隔离作用域会停止调用ctrl
上的$render()
有人知道这是不是正确的方法,或者是否有一种更像角度的方法仍然可以解决我的需求吗?首先,我相信如果样式是你的问题,你肯定可以通过css定制输入,而不是创建一个必须模仿输入复选框的指令
也就是说,添加和删除类的方法是将它们作为表达式或参数包含在模板中。
您还可以通过在模板中包含一个ngClick来避免绑定
app.directive('myCheckbox', function() {
return {
restrict: 'E',
replace: true,
transclude: true,
template: '<span class="checkbox" ng-class="{checked: isChecked}" ng-click="toggleMe()"></span>',
scope: { isChecked: '=?'},
link: function(scope, elem, attrs) {
scope.isChecked = true;
scope.toggleMe = function() {
scope.isChecked = !(scope.isChecked);
}
}
});
app.directive('myCheckbox',function(){
返回{
限制:'E',
替换:正确,
是的,
模板:“”,
作用域:{isChecked:'=?'},
链接:功能(范围、要素、属性){
scope.isChecked=true;
scope.toggleMe=函数(){
scope.isChecked=!(scope.isChecked);
}
}
});
首先,为了解释我的意思,我相信如果样式是你的问题,你肯定可以通过css定制输入,而不是创建一个必须模仿输入复选框的指令
也就是说,添加和删除类的方法是将它们作为表达式或参数包含在模板中。
您还可以通过在模板中包含一个ngClick来避免绑定
app.directive('myCheckbox', function() {
return {
restrict: 'E',
replace: true,
transclude: true,
template: '<span class="checkbox" ng-class="{checked: isChecked}" ng-click="toggleMe()"></span>',
scope: { isChecked: '=?'},
link: function(scope, elem, attrs) {
scope.isChecked = true;
scope.toggleMe = function() {
scope.isChecked = !(scope.isChecked);
}
}
});
app.directive('myCheckbox',function(){
返回{
限制:'E',
替换:正确,
是的,
模板:“”,
作用域:{isChecked:'=?'},
链接:功能(范围、要素、属性){
scope.isChecked=true;
scope.toggleMe=函数(){
scope.isChecked=!(scope.isChecked);
}
}
});
为了解释我的意思,$render函数不是为checkbox调用的。我们可以监视模型更改,检查元素状态,并相应地更新UI,而不是提供render函数
下面是指令代码
var-app=angular.module('RadioOrCheck',[]);
应用程序控制器('MainCtrl',函数($scope){
$scope.name='World';
});
应用指令(“radioOrCheck”,radioOrCheckDirective);
函数RadiorCheckDirective(){
返回{
要求:'ngModel',
限制:“A”,
范围:假,
链接:链接
};
功能链接(范围、元素、属性){
元素.addClass('hidden-input').wrap(“”);
element.parent().addClass(attrs.type).append(“”);
作用域$watch(attrs.ngModel,函数updateUI(){
element.parent().toggleClass('checked',jQuery(element).is(':checked');
});
属性$observe('label',函数(newLabel){
element.parent().find('span').text(newLabel);
});
}
}
。隐藏输入{
边界:0;
剪辑:rect(0);
身高:0;
保证金:0;
溢出:隐藏;
填充:0;
位置:绝对位置;
宽度:0;
}
.收音机{
显示:块;
光标:指针;
颜色:红色;
}
.收音机,检查过了{
颜色:绿色;
}
.复选框{
显示:块;
光标:指针;
颜色:红色;
}
.checkbox.checked{
颜色:绿色;
}
复选框不调用$render函数。我们可以监视模型更改,检查元素状态,并相应地更新UI,而不是提供render函数
下面是指令代码
var-app=angular.module('RadioOrCheck',[]);
应用程序控制器('MainCtrl',函数($scope){
$scope.name='World';
});
应用指令(“radioOrCheck”,radioOrCheckDirective);
函数RadiorCheckDirective(){
返回{
要求:'ngModel',
限制:“A”,
范围:假,
链接:链接
};
功能链接(范围、元素、属性){
元素.addClass('hidden-input').wrap(“”);
element.parent().addClass(attrs.type).append(“”);
作用域$watch(attrs.ngModel,函数updateUI(){
element.parent().toggleClass('checked',jQuery(element).is(':checked');
});
属性$observe('label',函数(newLabel){
element.parent().find('span').text(newLabel);
});
}
}
。隐藏输入{
边界:0;
剪辑:rect(0);
身高:0;
保证金:0;
溢出:隐藏;
填充:0;
位置:绝对位置;
宽度:0;
}
.收音机{
迪普拉