修改ng-messages指令仅在字段为$ dirty时显示

时间:2015-05-24 17:47:14

标签: javascript angularjs ng-messages

我目前对所有的ng-messages使用这样的标记

def calc
    f1 = File.open("./file1.txt", File::RDWR)
    f2 = File.open("./file2.txt", File::RDWR)
    f1.flock(File::LOCK_EX)
    f2.flock(File::LOCK_EX)

    f1.each.zip(f2.each).each do |line, line2|

    bg = line.split(";").compact.collect(&:strip)
    bd = line2.split(";").compact.collect(&:strip)

    n = bd[2].to_i - bg[25].to_i
    f2.print bd[2] << n
    #puts "#{n}" Only for testing
    end

    f1.flock(File::LOCK_UN)
    f2.flock(File::LOCK_UN)
    f1.close && f2.close
end

虽然它有点乱,我想以某种方式覆盖或扩展ng-messages,以便它自动检查字段是否脏或字段嵌套在里面的形式(通过走DOM可能? )是$提交。

我希望这是我网站中所有ng-messages的默认行为,并且当我需要在未使用输入且表单没有时显示错误消息时,无法预测这种情况。已提交,所以我认为覆盖这种行为是安全的,我只是不知道该怎么做。

我知道我可以完全替换ng-messages,但是我必须重新创建该指令的所有默认行为,这些行为可能会在未来的角度版本中发生变化,所以我宁愿在可能的情况下扩展它。我不知道Angular是否为此提供了任何钩子(我已经模糊地听说过装饰器方法?)或者是否要制作一个兄弟指令,比如“ng-custom-messages”,如果条件不是那么只会隐藏元素见过吗?

所以,我有几个想法,但我需要一点点推动来展示如何实现它们,只需要一些骨架代码,如果有人感到慈善?

2 个答案:

答案 0 :(得分:0)

遗憾的是,写了一个新的表单指令,当提交发生时,automaticalley将所有字段设置为脏。

这是一段简短的代码片段......

angular.forEach( formCtrl , function ( formElement , fieldName ) {

    if ( fieldName[0] === '$' ){
        return;
    } 

    formElement.$setDirty();

}, this);

formCtrl.$setDirty();
scope.$apply();

答案 1 :(得分:0)

我建议在使用ngIf的元素上使用ngMessages。请注意,ngMessages接受$error(或NgModelController)的FormController属性。

<div ng-if="myForm.fieldName.$invalid && (myForm.fieldName.$dirty || myForm.$submitted)"
        ng-messages="myForm.fieldName.$error">
    <div ng-message="required">This field is required</div>
    <div ng-message="minlength">Your field is too short</div>
</div>

顺便说一句,您可能会发现使用$touched代替$dirty更合适,以便推迟错误反馈,直到元素失去焦点(或表单)已提交)。