Javascript 在AngularJS中遍历或查询$scope

Javascript 在AngularJS中遍历或查询$scope,javascript,angularjs,angularjs-directive,angularjs-scope,Javascript,Angularjs,Angularjs Directive,Angularjs Scope,我有一个带有指令和控制器的嵌套结构,我必须从该结构的叶访问根控制器的scope属性。我是这样做的: $scope.$parent.$parent.$parent.property.value.push({ name: "Diego" }); 但这是丑陋和不可靠的。我想知道是否有更好的方法,也许是询问范围?我注意到每个$scope都有一个ID,是否可以使用它在不遍历整个结构的情况下检索作用域?谢谢。我会在$broadcast和$on的帮助下完成这项工作。看 在指令中,您可以执行以下操作: $ro

我有一个带有指令和控制器的嵌套结构,我必须从该结构的叶访问根控制器的scope属性。我是这样做的:

$scope.$parent.$parent.$parent.property.value.push({ name: "Diego" });

但这是丑陋和不可靠的。我想知道是否有更好的方法,也许是询问范围?我注意到每个$scope都有一个ID,是否可以使用它在不遍历整个结构的情况下检索作用域?谢谢。

我会在$broadcast和$on的帮助下完成这项工作。看

在指令中,您可以执行以下操作:

$rootScope.$broadcast('directiveName.message', {name: 'Diego'});
在控制器中,您将监听以下事件:

$rootScope.$on('directiveName.message', function(message) {
    console.log(message.name);
});

AngularJS是围绕依赖注入的思想构建的。因此,不鼓励查询范围之外的数据

您有几个选择:

  • 如果需要访问
    $rootScope
    ,只需让AngularJS注入即可
例如,如果使用控制器:

myApp.controller('myCtrl', function ($rootScope) {
  // AngularJS will recognize the parameter and populate it
  $rootScope.property.value.push({name: 'Diego'});
});
  • 如果需要访问控制器,可以使用指令控制器()
例如,您可以将指令控制器附加到主体,并与子对象中的任何指令共享该控制器:

myApp.directive('body', function () {
  return {
    restrict: 'E',

    controller: function () {
      this.hello = function () { … };
    }
  };
});

myApp.directive('myDir', function () {
  return {
    require: '^body',

    link: function (scope, element, attr, bodyCtrl) {
      bodyCtrl.hello();
    }
  };
});
  • 最后,您还可以创建一个单例服务,并在需要时要求它

逻辑不应要求您这样做。你需要重新思考你的逻辑,并尝试这里提到的解决方案。我曾考虑过这种解决方案,但我不确定在我已经知道谁拥有我需要的功能的情况下,广播消息是否“漂亮”。