Angular.js $监视表单/表单输入有效性

时间:2014-01-16 14:32:31

标签: javascript angularjs

为什么这款深表不会开火?

http://plnkr.co/edit/6FxMS4RlfljBMkprZYQs?p=preview

手表不检查角度属性吗? IE浏览器。那些用美元乞讨?如果是这种情况,有没有办法观察有效性变化,而不仅仅是在表格上,而是在任何输入上?

3 个答案:

答案 0 :(得分:5)

解决方案是观看。$ error,这很好用。见http://plnkr.co/edit/6FxMS4RlfljBMkprZYQs?p=preview

这基本上就像在表单上观看有效一样,除非每次更新任何有效内容时都会更新。

信用转到https://stackoverflow.com/users/490498/jonathan-rowny

答案 1 :(得分:2)

也许稍晚但我找到了另一种方式。使用:

$scope.$watchCollection

特别是你可以使用$ watchColletion在范围内观看myForm变量,并更新你的按钮或你需要的任何东西。

$scope.$watchCollection(function () {
        if ($scope.myForm)
            return $scope.myForm;
    }, function () {
       if ($scope.myForm)
       if (($scope.myForm.$invalid == true))
              $scope.formValidityChange(true);
        else
            $scope.formValidityChange(false);
    }, true);

这将检查表单内更改的所有变量,您将更新控制器。我想你也可以通过比较两个对象来检查改变了什么,这可能会更困难。

答案 2 :(得分:0)

$ watch监视$ scope的变化。由于您的输入未绑定到正在监视的同一$ scope属性,因此您的监听侦听器仅在初始化时被调用一次。

为了更好地了解$ watch,binding和$ scope是如何工作的,这就是你的范围看起来的样子(实际上,你的范围是空的,因为你没有写任何东西,但这就是它看起来像是基于你的模板):

{
    shizzle: { // <--- This is the property you're watching
        $valid: false,
        whatev: { 
            valid: false
        }
    },
    whatev: "" // <--- This is the object that is changing when you type into the <input>

}

正如你所看到的那样,shizzle正在被观看,但不会改变,所以手表监听器只会被解雇一次。

以下是您的plunker的编辑版本,它将观察者绑定到输入的模型,并记录所有更改,以供演示:

http://plnkr.co/edit/NrE5blIbyBcsOjC2vIrk?p=preview

编辑:如果你的目标是观察$ valid属性,即设置了角度,那么你可以改变这一行:

scope.$watch(attrs.name, function(newVal, oldVal) {
    console.log(newVal);
}, true);

到此:

scope.$watch("shizzle.$valid", function(newVal, oldVal) {
    console.log(newVal);
}, true);