Angularjs 如何将指令绑定到注入的服务而不是父或隔离的作用域?

Angularjs 如何将指令绑定到注入的服务而不是父或隔离的作用域?,angularjs,angularjs-directive,Angularjs,Angularjs Directive,关于这个问题: 基本上,我有一个视野之外的导航。导航需要显示用户有权访问的菜单项 我使用如下指令创建导航标记: <tree family="treeFamily"></tree> 其中treeFamily是用于构建导航菜单的数据 但是,由于我的导航在任何视图之外,它没有控制器,因此没有称为treeFamily的范围变量。这意味着指令不会获取任何数据来创建导航 我原本以为可以将菜单项的数据注入一个服务,但是我无法告诉angular指令使用从注入的服务获取的数据进行绑定

关于这个问题:

基本上,我有一个视野之外的导航。导航需要显示用户有权访问的菜单项

我使用如下指令创建导航标记:

<tree family="treeFamily"></tree>

其中
treeFamily
是用于构建导航菜单的数据

但是,由于我的导航在任何视图之外,它没有控制器,因此没有称为
treeFamily
的范围变量。这意味着指令不会获取任何数据来创建导航

我原本以为可以将菜单项的数据注入一个服务,但是我无法告诉angular指令使用从注入的服务获取的数据进行绑定


唯一可能的另一种方法是使用名为treeFamily的$rootScope变量,并将指令生成的标记绑定到该变量

如果您不想使用
$rootScope
变量,这里有一个稍微粗糙的解决方案,但是您可以通过元素获得范围

例如

假设您的数据应用于一个测试控制器,所以您有这样一个元素

<div id="test" ng-controller="test">
在这里,您可以访问需要从中获取数据的范围,演示正在进行中

演示:

在演示中,随机指令在控制器外部时,从测试控制器访问
treeFamily
数据

如果您不希望服务数据是可绑定的,您可以这样做

app.directive('something', function( $someNavDataService ) {
    return function( $scope ) {
       $scope.navData = $someNavDataService;
    }; 
});

我仍然认为你们想看看AngularUI路由器,正如我在你们的文章中提到的

然而,在没有angular ui router的情况下,我这样做的方法是创建服务,然后在声明时将服务注入到指令中,并根据使用其中的数据

例如:

angular.module('yourModule').service('yourService', function() {
   // define your service
});

angular.module('yourModule').directive('yourDirective', function(yourService) {
  return {
     link: function postLink(scope, element, attrs) {
       // you can now define your directive and access your yourService service
     }
  };
});

虽然您的答案符合OP中的标准,但此解决方案比将其放入$rootScope更糟糕。我想到的一件事是,这意味着我必须有一些控制器的元素,仅仅是为了导航。在这种情况下,我可以只分配一个父控制器并传入数据。如果没有控制器,则作用域中没有任何数据,因此。。。。。什么?如果你没看到,我说这是一个有点粗糙的解决方案,看起来这里有一些沟通错误。在OP中,任何对作用域的引用都只是简单地说我找到的解决方案使用了一个隔离的作用域来绑定数据。我试图绑定通过服务传递到指令中的数据。我原以为可以在隔离范围内创建一个变量,并将服务中的数据分配给它。那不行。因此,现在我正在征求意见,以了解如何使用服务中的数据创建指令。
angular.module('yourModule').service('yourService', function() {
   // define your service
});

angular.module('yourModule').directive('yourDirective', function(yourService) {
  return {
     link: function postLink(scope, element, attrs) {
       // you can now define your directive and access your yourService service
     }
  };
});