Angularjs 角度窗体:在自定义指令上设置$dirty属性

Angularjs 角度窗体:在自定义指令上设置$dirty属性,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我们有一个指令(比如check按钮),它创建了一个带有特定功能的样式化复选框 我在指令中需要ng表单,因此我可以在指令中使用formCtrl,并成功地将表单设置为$dirty或$valid我的问题是如何将指令创建的特定元素设置为$valid或$dirty,并且通常作为角形元素。只是执行element.$valid=false无法按Ctrl.addControl(element)中的操作,所以我被卡住了。我应该强调,这个指令是在ng repeat循环中使用的,所以我可以在它上面设置一个“名称”,因

我们有一个指令(比如check按钮),它创建了一个带有特定功能的样式化复选框

我在指令中需要ng表单,因此我可以在指令中使用formCtrl,并成功地将表单设置为$dirty或$valid我的问题是如何将指令创建的特定元素设置为$valid或$dirty,并且通常作为角形元素。只是执行
element.$valid=false
无法按Ctrl.addControl(element)中的
操作,所以我被卡住了。我应该强调,这个指令是在ng repeat循环中使用的,所以我可以在它上面设置一个“名称”,因为ng repeat可以通过编程方式设置名称(必须是字符串)

这是(简化的)模板:

<div class="check-button ">
    <div c" ng-class="{ 'active': value != undefined ? btnState == value : btnState }">
        <i class="icon-ok"></i>
    </div>
    <div class="pull-left btn-label" ng-transclude></div>
</div>

我们使用的是最新的angular版本(1.2.10)

您基本上需要
表单
ngModel
作为
表单。$addControl
需要
ngModelController

您不能将元素添加到
表单控制器
,您需要该元素的
ngModelController
。现在,你能提供一个劫掠者吗?谢谢@beyers!在两者都需要之后,我如何添加它?只需添加modelCtrl对象?@alonisser实际上不必做任何事情来注册控件,因为ngModel指令本身会注册到表单中。因此,您所需要的只是对ngMogelController的引用,这样您就可以使用它的API了。对于ngModelController API和自定义控件示例,请查看
angular.module('our.directives').directive('checkButton', [function() {
    return {
        restrict: 'A',
        require:'?^form', //may be used outside a form
        templateUrl: '/tempalte/path/tpocheckbutton.html',
        scope: {
            btnState: '=ngModel',
            value: '=radioBtn'
        },
        replace: true,
        transclude: true,
        link: function($scope, $element, $attrs, formCtrl) {
            if(formCtrl){

                formCtrl.$addControl($element)//doesn't work
            }

            $scope.$watch(function() {
                return $scope.btnState;
            }, function(newValue) {
                $scope.btnState = newValue;
            });

            var _onElementClick = function() {
                if($scope.value != undefined) {
                    $scope.btnState = $scope.value;
                } else {
                    $scope.btnState = !$scope.btnState;
                }
                if(formCtrl){
//                    $element.$dirty = true;//doesn't work
                    formCtrl.$setDirty(); //does set the form as dirty - but not the field
                }

            };

            $element.find('.button, .btn-label').on('click', _onElementClick);
        }
    };
}]);