0

我已经创建了一个指令,它有一个隔离的范围。不知何故,当我试图从指令的元素获取范围时,它给了我控制器的范围,而不是隔离范围。scope()方法在Angular JS中如何工作?

我的代码有什么问题?谁可以解释scope()方法是如何工作的?

这是我的js代码:

angular.module('myApp',[]) 
    .directive('component',function(){ 
     return { 
      restrict:'EA', 
      replace:false, 
      scope:{ 
       "model":"=" 
      }, 
      template:'<div>{{model.name}}</div>', 
      link:function($scope,element,attrs){ 
       element.bind('click',function(event){ 
        console.log("element scope id->", element.scope().$id); 
       }); 
      } 
     }; 
    }) 
    .controller('AppCtrl',function($scope){ 
     $scope.myModel = { 
      name:"Click me, to see scope's id in console" 
     }; 
     console.log("controller scope id->", $scope.$id); 
    }); 

和标记:

<div ng-app="myApp" ng-controller="AppCtrl"> 
    <component selectable model="myModel"></component> 
</div> 

DEMO is here

+0

你不需要从元素中获取范围,用'$ scope'替换'element.scope()'。 – haki 2014-10-01 07:40:34

+0

而“模型”绑定似乎并没有创建任何额外的隔离范围。这就是您收到组件范围的原因。 – jevgenig 2014-10-01 07:44:16

+0

@haki是的,我知道。但我需要从*元素*中检索范围。这是必须的。 – Engineer 2014-10-01 07:45:25

回答

0

你需要改变这一行:

console.log("element scope id->", element.scope().$id); 

为此:

console.log("element scope id->", $scope().$id); 

如果你想从该元素的范围,这样做:

console.log("element scope id->", element.isolateScope().$id); 

通知调用isolateScope。请参阅https://docs.angularjs.org/api/ng/function/angular.element#methods

0

在您的指令中,您已通过创建它自己的作用域对象作为私有作用域。范围:{model:'='}。这就是为什么element.scope()实际上是父级的范围。

这里有几个事实:

  • 指令的范围$()$父= element.scope()
  • 家长无法访问的孩子的范围。尽管有一些像element.scope()。$$ childHead这样的解决方法,但它不被推荐,并且它一直不工作。为了与孩子的父母进行交流,你可以使用$ scope()。$ broadcast('event-name',param1,param2),并使用$ scope从$ child中捕获事件。$ on('event-name ',函数($ parentScope,param1,param2){...})
  • 您可以使用$ scope()。$ parent.methodName()直接调用父级方法或访问父级模型,从子级到父级进行通信,或者使用类似$ scope()。$ emit('event-name',param1,param2)的事件触发,并且使用$ scope从父项中捕获事件$ on('event-name',function($ childScope,param1,param2 ){...})

希望这会有所帮助。