Javascript AngularJS从指令内的祖先作用域调用方法

Javascript AngularJS从指令内的祖先作用域调用方法,javascript,angularjs,Javascript,Angularjs,我有一个Angular应用程序,我正在使用ui网格。我想在网格的单元格上有一个自定义操作,该单元格从我的应用程序调用一个方法。所以基本上,这意味着从指令调用父层次结构中某个位置的方法 这可以通过调用:$scope.$parent.$parent.$parent.$parent.$parent.foo()之类的函数来实现。但这似乎不太好 一种选择是创建一个递归函数,该函数沿着$scope的祖先向上扩展。这样更好,但还是有点奇怪 还有。。。尝试实现这样的目标是一种好的做法吗?您认为$parent.$

我有一个Angular应用程序,我正在使用ui网格。我想在网格的单元格上有一个自定义操作,该单元格从我的应用程序调用一个方法。所以基本上,这意味着从指令调用父层次结构中某个位置的方法

这可以通过调用:$scope.$parent.$parent.$parent.$parent.$parent.foo()之类的函数来实现。但这似乎不太好

一种选择是创建一个递归函数,该函数沿着$scope的祖先向上扩展。这样更好,但还是有点奇怪


还有。。。尝试实现这样的目标是一种好的做法吗?

您认为
$parent.$parent.$parent肯定不是一种好的做法

如果正在调用的方法是另一个指令,则可以在子指令中要求该指令,然后将parentDirective的控制器函数作为第四个参数注入到链接函数中:

在您的DDO中:

return {
    require : '^parentDirective',
    restrict : 'E',
    link : function (scope, elem, attrs, parentDirectiveController) {}
}
如果您试图调用的是工厂/服务,则可以将该工厂/服务注入到指令中,尽管这有时是一种代码味道,具体取决于您试图注入的内容

最后,另一种方法是使用事件传播。根据您的指令,您可以使用
$scope.$emit
向上级控制器发送信息:

根据指令:

$scope.$emit('directiveDidStuff', {
    data : 'blah'
});
在父控制器中:

$scope.$on('directiveDidStuff', function (evt, params) {
    this.data = params.data;  // equals blah
});

您可以通过指令中的一个范围变量使用“&”来实现同样的效果。例如,您可以将事件绑定到控制器方法,也可以从该方法,您可以做您想要做的事情,或者如果您希望在网格的onClick上实现的原始业务逻辑跨多个模块使用,那么您可以在服务中将其平分,使其可重用,并从事件方法调用服务。如果您对该方法有任何疑问,请告诉我

示例的关键代码:

Html

   <my-component attribute-foo="{{foo}}" binding-foo="foo" isolated-expression- foo="updateFoo(newFoo)" >

可能使用
事件
。$emit方法正是我所需要的。谢谢
    var myModule = angular.module('myModule', [])
.directive('myComponent', function () {
    return {
        restrict:'E',
        scope:{
            /* NOTE: Normally I would set my attributes and bindings
            to be the same name but I wanted to delineate between 
            parent and isolated scope. */                
            isolatedAttributeFoo:'@attributeFoo',
            isolatedBindingFoo:'=bindingFoo',
            isolatedExpressionFoo:'&'
        }        
    };
})