【问题标题】:angular set dirty form within directive controller指令控制器中的角度设置脏形式
【发布时间】:2026-02-20 11:20:03
【问题描述】:

我有一个使用 $dirty 的角度驱动表单来发现启用/禁用提交按钮的更改。

表单的一部分使用指令来上传徽标,但表单注意到这是一个更改的元素,因此在设置验证大小的徽标时,我需要手动触发表单已发生更改,因此应该是一个案例formName.$setDirty();但是控制台说 $setDirty() 没有定义,我认为这是因为我在指令中。

在我的指令控制器中,我在文件选择时调用下面的函数,当文件有效时,我想调用 setdirty 方法。

function isFileValid(file) {
        vm.fileValid = true;
        vm.errorMessage = "";

        if (file.size > 16777216) {
            vm.errorMessage = "The File is too big!";
            vm.fileValid = false;
        } else if (file.size == 0) {
            vm.errorMessage = "The File is empty!";
            vm.fileValid = false;
        }

        if (vm.fileValid) {
            // make form dirty
            $setDirty();
        }

        return vm.fileValid;
    }

这里是指令JS

(function () {
'use strict';
    .module("tpBusinessProfile")
    .directive("tpLogoUploader", tpLogoUploader);

function tpLogoUploader() {
    return {
        templateUrl: "tpLogoUploader.directive.html",
        bindToController: true,
        scope: {
            changedMethod: "&"
},
        controller: "tpLogoUploaderCtrl",
        controllerAs: 'logoCtrl',
        restrict: "E"
    };
}

})();

感谢任何帮助。

【问题讨论】:

    标签: angularjs angular-directive


    【解决方案1】:

    你需要使用指令require选项和表单指令的require控制器:

    {
         require: '^form'
    

    然后在你需要的链接函数绑定方法中(肮脏的解决方案):

      link(scope, elem, attrs, formController){
          scope.makeFormDirty = formController.$setDirty
      }
    

    现在你可以通过makeFormDirty在你的控制器中使用它

    【讨论】:

    • 感谢您的快速回复,我添加了要求并链接到我的指令,但是表单提交按钮始终是可选的,因为它似乎在页面加载后立即设置为脏。如果我注释掉 scope.makeFormDirty = formController.$setDirty() 那么提交按钮仍然被锁定;在这个阶段我什至没有调用makeformDirty。谢谢
    • 对不起,当然应该是scope.makeFormDirty = formController.$setDirty 而不是$setDirty()
    • 您好,非常感谢提交按钮现在仍然被锁定,这是正确的 - 但是当从我的指令调用 makeFormDirty 时,它没有解锁提交按钮,我是否需要引用类似于提交按钮的表单名称点击状态由 ng-disabled="myForm.$invalid || myForm.$pristine" 控制