Javascript 如何在angularjs 1.3中将表单中的特定字段设置为dirty

Javascript 如何在angularjs 1.3中将表单中的特定字段设置为dirty,javascript,angularjs,Javascript,Angularjs,我想将某个特定表单的字段设置为手动更改该值时的脏值。我已经执行了SO线程,但运气不好 这是我的问题的样本副本。 input.ng-invalid{ 边框:1px纯红; } input.ng-valid{ 边框:1px纯绿色; } 输入。ng-原始{ 边框颜色:#FFFF00; } var sampleApp=angular.module(“sampleApp”,[]); 控制器('sampleCtrl'、['$scope'、'$http'、'$timeout', 函数($scope、$htt

我想将某个特定表单的字段设置为手动更改该值时的脏值。我已经执行了SO线程,但运气不好

这是我的问题的样本副本。


input.ng-invalid{
边框:1px纯红;
}
input.ng-valid{
边框:1px纯绿色;
}
输入。ng-原始{
边框颜色:#FFFF00;
}
var sampleApp=angular.module(“sampleApp”,[]);
控制器('sampleCtrl'、['$scope'、'$http'、'$timeout',
函数($scope、$http、$timeout){
$scope.userData={
用户名:“”,
};
$timeout(函数(){
$scope.userData.username='$#deepak';
}, 5000);
}
]);
sampleApp.directive('myUsername'[
函数(){
//在编译期间运行
返回{
require:'ngModel',//数组=多个requires,?=可选,^=检查父项
链接:功能($scope、iElm、iAttrs、controller){
控制器.$parsers.unshift(函数(值){
//仅允许字母数字字符
var reg=/^\w+$/;
var isValidUsername=注册测试(值);
控制器.$setValidity('username',isValidUsername);
返回isValidUsername?值:未定义;
});
控制器.$formatters.unshift(函数(值){
var reg=/^\w+$/;
var isValidUsername=注册测试(值);
控制器.$setValidity('username',isValidUsername);
$scop e.registrationForm.username.$setViewValue($scope.registrationForm.username.$viewValue);
返回值;
})
}
};
}
]);
{{message}}
    {{err}}
用户名
无效的用户名。

在示例中,我在5秒钟后修改用户名(仅用于示例)。同时,我希望将字段设置为dirty,并启动验证并显示错误消息

请帮忙。

Deepak

这是带有解决方案的plnkr。不要直接更新$scope.userData.username并绕过“model to view”的解析器管道,而是使用jQuery更新输入字段并触发“change”事件,并使用Angular提供的“view to model”管道

            $timeout(function(){
              jQuery("[name=username]").val('$#deepak');
              jQuery("[name=username]").trigger('change');
            }, 5000);
实现了另一个带有$render的plnkr。这适用于“model to view”管道,$render在$parser之后调用,并根据错误设置样式

    controller.$render = function() {
      console.log('in render');
      iAttrs.$set('value', controller.$viewValue);
      if (controller.$invalid && controller.$viewValue.length !== 0) {
        iElm.css("border", "1px solid red");
      } else if (controller.$viewValue.length === 0) {
        iElm.css("border", "1px solid gold");
      } else {
        iElm.css("border", "1px solid green");
      }
    };

这两种解决方案感觉都像是黑客,而$render感觉更像是黑客。无论$render中设置了什么,都必须在$parser中进行补偿并撤消

好吧,它使用线程()中讨论的$dirty标志对我有效:

请参见此处的工作plunker:

谢谢您的回复。它可以工作,但在angular中不可能吗?我也在研究这个问题,angular的旧版本使用了一种方法,包括将相关ngModel属性的值设置为它自己的当前值。。。这将触发脏标志。不幸的是,这在1.3中似乎不再有效+
    controller.$render = function() {
      console.log('in render');
      iAttrs.$set('value', controller.$viewValue);
      if (controller.$invalid && controller.$viewValue.length !== 0) {
        iElm.css("border", "1px solid red");
      } else if (controller.$viewValue.length === 0) {
        iElm.css("border", "1px solid gold");
      } else {
        iElm.css("border", "1px solid green");
      }
    };
$timeout(function(){
    $scope.userData.username = '$#deepak';
    $scope.registrationForm.username.$dirty = true;
}, 5000);