自定义复选框指令的angularJS方式?

自定义复选框指令的angularJS方式?,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我正在尝试构建一个自定义的checkbox指令(以便能够按照我喜欢的方式进行样式设置),而不是使用。它应该像人们期望的那样工作;更新模型应该更新视图,单击该框应该更新模型,它应该听required指令(验证应该有效) 我目前有以下指令,完全按照预期工作: 'use strict'; angular.module('directives.checkbox', []) .directive('checkbox', [function () { return { restri

我正在尝试构建一个自定义的checkbox指令(以便能够按照我喜欢的方式进行样式设置),而不是使用
。它应该像人们期望的那样工作;更新模型应该更新视图,单击该框应该更新模型,它应该听
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;
}
.收音机{
迪普拉