angularjs指令 - 获取parentScope未定义错误

时间:2014-06-04 12:27:01

标签: angularjs angularjs-directive

我们在应用程序中有嵌套指令。 我们将控制器的scope.openFundReport传递给内部指令。

<div ng-controller="app"> 
  <sa-grid src="accounts"> 
      <my-directive data="row.funds" onclick="parentScope.openFundReport(f)"  />
   </sa-grid>

指令js

    angular.module("app").directive("myDirective",function(){
     return{
            restrict:"E",
               scope:{
                      data:"=", 
                      onclick="&"
                     },
              controller : function($scope){
                    $scope.openReport=function(f){
                    $scope.onclick({f:f});
                    }
                 },
               templateUrl="t.html"
             }
         }

        });

指令html

  <div> 
    <ul>
       <li ng-repeat="f in funds">
         <a ng-click="openReport(f)">{{f.symbol}}</a>
       </li>
     </ul>
   </div>

点击链接后,控制器的openFundReport函数会被正确调用。 但错误是在浏览器中记录, 未捕获的ReferenceError:未定义parentScope(索引):1 的onclick

JS Fiddler示例http://jsfiddle.net/9X3V4/2/

2 个答案:

答案 0 :(得分:1)

问题应该是显而易见的,但是方式花了太长时间才能看到它。您通过openFR属性传递了onclick,该属性有效。但onclick也是标准的javascript事件。在Angular完成它之后,javascript处理事件,当然它找不到openFR。解决方案是将您的属性命名为其他内容,例如点击&#39;或点击事件&#39;。

Fiddle

答案 1 :(得分:-1)

如果你想执行一个函数onclick你需要使用=而不是&amp;然后在你的指令触发的指定事件上调用该函数,比如

 angular.module("app").directive("myDirective",function(){
 return{
        restrict:"E",
           scope:{
                  data:"=", 
                  onclick="="
                 },
          controller : function($scope){
                $scope.openReport=function(f){}
            },
           templateUrl="t.html"
         }
     }

    });

我从未尝试过这个,但它应该通过使用=你绑定到父范围函数。如果这不能解决问题,你可能想在指令中创建一个ngClick处理程序,然后从处理程序中调用传递的函数

注意:这是我自己测试的指令

   directive('dir3', [ function() {
       return {
        restrict:'C',
        template:'<button ng-click="click()"></button>',
        scope:{
            click:'='
        },
        link: function(scope, element, attrs){
       }
     }}]);

用法

  <div click="click" class="dir3">click</div>

控制器部分

     $scope.click=function(){
          alert('hola');
      }