是否可以在范围内使用ngModelController时感到困惑

时间:2013-11-17 12:58:28

标签: angularjs angularjs-controller

我对使用ngModelController非常困惑。例如,指令中的控制器可以像这样要求。

myModule.directive('amValidateName', ['validate', function (validate) {
    return {
        restrict: 'A',
        scope: {
            errorName: '='
        },
        require: 'ngModel',

        link: function (scope, elm, attrs, ngModelCtrl) {
        }
    }
}]);

但是也允许在ng-controller上使用ngModelCtrl,就像这样

myModule.controller('SignUpCtrl', ['$scope', 'validate', function ($scope, validate) {

        //Can i use ngModelController here, methods like $setPristine()?

}]);

我在角度文档中找到了这句话

Such DOM related logic should be provided by other directives which make use of NgModelController for data-binding.

这意味着,我只需要通过其他指令来使用ngModelController,就像第一个例子一样。

1 个答案:

答案 0 :(得分:1)

您可以通过$ scope上发布的表单控制器与每个模型控制器进行交互。在ngModel的链接阶段,它使用其父窗体指令进行注册,然后将窗体的控制器发布到$ scope。这使您可以在$ scope上单点与表单和表单上的任何模型进行交互。下面是一个简单的示例,当用户尝试转到新路径时,您的控制器会检查窗体是否脏了:

app.controller('myController', ['$scope', '$window', function ($scope, $window) {
    $scope.$on('$locationChangeStart', function (event) {
        if ($scope.myForm.$dirty) {
            if (!$window.confirm('You have unsaved changes. Do you want to discard all changes?')) {
                event.preventDefault();
            }
        }
    });
}]);

现在,如果您应该在控制器内或在单独的指令中执行这些类型的逻辑,那么这是值得商榷的。上面的例子很简单,但是当你想要在你使用控制器发布到你的服务器之后对服务器收到的错误设置验证状态这样的事情时,我绝对没有理由不应该在你的服务器中应用这个控制器。

更新:根据下面的@charlietfl评论,表单必须有name,并且该名称将成为对象绑定的范围变量,例如:

<form name="myForm">
</form>