【问题标题】:Accessing ngModel in Directive's controller function在 Directive 的控制器函数中访问 ngModel
【发布时间】:2014-05-12 23:46:25
【问题描述】:

我有一个包含一些子指令的自定义表单元素指令。我在父指令中需要ngModel,以便我可以在指令HTML 声明中使用ng-model="object.data"

我遇到的问题是从子指令中更改该值。子指令可能需要父控制器函数,但该控制器函数无法访问 ngModelController,而 postLink 函数只能使用(我可能错了)。

ControllerLink 函数都可以访问相同的范围(在这种情况下,并不总是如此),因此我可以执行以下操作:

.directive('myDirective', [function() {
    return {

        ....

        controller: function ($scope, $element, $attrs) {
            this.select = function (selected) {
                $scope.ngModelCtrl.$setViewValue(selected);
            };
        },
        link: function (scope, elem, attrs, ngModelCtrl) {
            scope.ngModelCtrl = ngModelCtrl;

        }
    };
}])

.directive('myChildDirective', [function () {
    return {
        require: '^myDirective',
        ....

        link: function (scope, elem, attrs, myDirectiveCtrl) {
            elem.bind('click', function () {
                myDirectiveCtrl.select(scope.value);
            });
        }
    }
}]);

通过将ngModelController 分配给范围,我可以在控制器函数方法中访问它,而该方法又可以由子指令调用,但这看起来很老套,必须有更好的解决方案,因此非常感谢任何帮助.

请看我的Plunkr here

【问题讨论】:

    标签: javascript angularjs angularjs-directive


    【解决方案1】:

    也许我不太明白你想要完成什么,但为什么不直接在元素上使用 ng-click,并在父控制器中完全处理它呢?

    如果您需要从父范围修改某些内容,请将该对象注入子范围。

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

    【讨论】:

    • 如果我想绑定到点击事件,那就太完美了。我正在寻找一种让孩子设置父母ng-model 值的方法,而不是专门针对点击事件(如果可能的话)。通过将对象注入子范围,您的意思是注入 ngModel 值并在父级中有一个$watch 表达式来调用ngModelCtrl.$setViewValue()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2023-03-06
    • 2015-02-20
    • 1970-01-01
    相关资源
    最近更新 更多