Javascript 角度1.2.16,隔离范围,父函数和ng点击

Javascript 角度1.2.16,隔离范围,父函数和ng点击,javascript,angularjs,angularjs-directive,angularjs-scope,Javascript,Angularjs,Angularjs Directive,Angularjs Scope,我被一个相当简单的关于角度的问题难住了(我认为这很简单)。有时候我会觉得自己很笨,因为我不可能做了什么可怕的错事 拿这个plnkr HTML: CLICKY(应执行父范围函数,但不执行) Javascript: angular.module('app', []) .controller('ASDF', function($scope){ $scope.doh = function(d){ alert(d); } }) .directive('fbLogin', fun

我被一个相当简单的关于角度的问题难住了(我认为这很简单)。有时候我会觉得自己很笨,因为我不可能做了什么可怕的错事

拿这个plnkr

HTML:


CLICKY(应执行父范围函数,但不执行)
Javascript:

angular.module('app', [])
.controller('ASDF', function($scope){
   $scope.doh = function(d){
      alert(d);
   }
})
.directive('fbLogin', function(){
   return {
     restrict: 'A',
     replace: false,
     scope: {
       done: '&fbLogin'
     },
     link: function(scope, element){
       element.on("click", function () { scope.done()('asdf') });
     }
   }
});
angular.module('app',[])
.controller('ASDF',函数($scope){
$scope.doh=函数(d){
警戒(d);
}
})
.directive('fbLogin',function(){
返回{
限制:“A”,
替换:false,
范围:{
完成:“&fbLogin”
},
链接:功能(范围){
scope.exec=函数(){
scope.done()('asdf');
};
}
}
});

这里发生了什么事?

因为ng click只能访问父作用域,所以它试图在ASDF控制器的作用域上执行exec

我相信这会给你想要的行为:

HTML:


隔离1.2版本中的范围是真正隔离的(请参阅)

修复($compile):使隔离范围真正隔离

修复了隔离作用域泄漏到其他位置的问题 同一元素上的指令

隔离作用域现在仅可用于 请求它及其模板

非隔离指令不应获取隔离的隔离范围 指令,相反,它们将接收原始 范围(新创建的隔离范围的父范围)

与托拜厄斯配对

中断更改:没有隔离作用域的指令不会获得 将作用域与同一元素上的隔离指令隔离。如果你的 代码取决于此行为(需要访问非隔离指令 将隔离指令更改为 使用作用域局部变量显式传递这些值

//以前

.directive('ngIsolate',function(){return{ 作用域:{}, 模板:{{value}}};})

//之后

.directive('ngIsolate',function(){return{ 作用域:{value:'=ngModel'}, 模板:{{value}};})

现在它工作的唯一方法是通过模板/templateUrl(在本例中使用transclude,所以我不需要重新创建它):

angular.module('app',[])
.controller('ASDF',函数($scope){
$scope.doh=函数(d){
警戒(d);
}
})
.directive('fbLogin',function(){
返回{
限制:“A”,
替换:false,
范围:{
完成:“&fbLogin”
},
是的,
模板:“”,
链接:功能(范围){
scope.exec=函数(){
scope.done()('asdf');
};
}
}
});

我在父作用域(ASDF控制器内部)上没有看到exec函数。它不是父控制器中的
exec
函数,而是
doh
函数(在隔离作用域中传递)。但是
exec()
没有执行,因此不执行父函数没有必要将
ng click=“exec()”
作为元素的属性,因为
exec
是指令本身的一部分,我们为什么要将它交给外部呢。相反,你可以做
element.click(function(){scope.done()('asdf');})
在这个指令中?这是我问题的一个简单版本,真正的应用程序有一个非常复杂的结构和许多其他指令和形式。在我的真实应用程序中,我从来没有在没有名称空间和控制器函数的情况下使用ng click。ng click将在ASDF控制器的作用域中查找exec。我相信隔离范围只适用于fb login指令。ty,你为我节省了大量时间
angular.module('app', [])
.controller('ASDF', function($scope){
   $scope.doh = function(d){
      alert(d);
   }
})
.directive('fbLogin', function(){
   return {
     restrict: 'A',
     replace: false,
     scope: {
       done: '&fbLogin'
     },
     link: function(scope, element){
       element.on("click", function () { scope.done()('asdf') });
     }
   }
});