查找最近控制器范围

时间:2015-10-02 14:42:03

标签: angularjs angularjs-scope

有没有办法在directiv e中找到最接近的父控制器作为控制器scope

Use case

line 212的重要部分是js file

我从指令呈现的模板在scope属性中传递了directive个表达式,我需要将它们链接到控制器scope

因为该指令具有隔离范围,所以我将其链接到scope.$parent,因为在这种情况下父节点是控制器。
但情况可能并非总是如此,因此如何找到最近的父控制器scope

如果它是控制器scope,我可以通过scope检查进行循环吗?

var template = angular.element(html);
var linkFn = $compile(template);
var child = linkFn(scope.$parent); //HERE IS THE PROBLEM
$(element).append(child);

4 个答案:

答案 0 :(得分:2)

您可以尝试在指令中使用jqLit​​e / jQuery方法遍历DOM树并找到所需的父(element.parent()等)。然后,您可以通过调用scope()方法获取与此父级相关的范围对象,您应该能够将其作为参数传递给编译函数。

答案 1 :(得分:2)

这不是最干净的方法,但您始终可以将对象传递给指令的范围。

chrome.tabs.move

然后,假设您的controllerAs设置为angular.app('myApp', []) .controller('myCtrl', [function() { var self = this; self.directiveConfig = { method1: function() { /* do something cool */ }, method2: function() { /* do something cool */ } }; }]) .directive('myElem', [function() { var myElem = { restrict: 'AE', controller: function() { /* some custom controller */ }, link: function(scope, element, attributes, ctrl) { /** * scope.config will now be tied to self.directiveConfig * as defined in the controller above */ }, scope: { config: '=' } }; }); ,您可以这样做。

ctrl

更好的解决方案是将您需要使用的任何功能放在可以重复使用的服务中。

答案 2 :(得分:2)

看到有很多方法。其中一种方法是,您可以检查在该控制器范围内定义的变量,如此

if(angular.isDefined(scope.$parent.variableName))
{
   // controller is defined
}
else
{
   // controller is not defined
}

如果定义了这个,那么它就是你的控制器,否则就是别的。第二种方法是像这样检查父母的父范围

if(angular.isDefined(scope.$parent.$parent)) {
  //controller is defined
}
else
{
  //controller is not defined
}

因为每个控制器的父级都是$ rootScope,或者是其他控制器的范围。这意味着如果它不是一个控制器,那么这将导致未定义,并将进入其他条件。

答案 3 :(得分:1)

要求ngController似乎是最好的解决方案。

.directive("mobilitTree", function() {
    return {
        ...
        require: "ngController",
        ...
        link: function(scope, element, attrs, ngCtrl) {
            ...
        }
    };
})

.controller("AppController", function($scope, ...) {
    //Only variable applied on this are public
    this.controllerOnSort = function(...) { ... };
});