这是很常见的事情,例如,如果您在此处单击stackoverflow上的收件箱。我会打电话给那个对话框或任何被打开的 东西 。
现在我知道有两种方法可以解决这个问题,
无论哪种情况,我都希望使用ng-class添加/删除将显示/隐藏 事物的类 。
ng-class
现在,我将如何使用angular做到这一点,以便可以在我可能添加的任何组件上使用。 好像我没有单一模式,我可能有很多不同的组件,它们具有不同的html结构,位置和内容。
记录事件,覆盖或其他完全哪种方法更好?
由于angular并没有真正引用dom,因此文档方法可能是一个问题,对,因为我无法完全检查是否单击了thing元素?除非我给每一 件事都 上同一堂课..
另一方面,重叠方法不需要引用dom元素。
两种方法在rootScope上都需要一个唯一的var ng-class才能起作用。这带来了使用ng-class还是自定义的问题。
无论如何,只是把我的想法扔在那里,也许我从一开始就在考虑它是错误的,以前有人处理过吗?
我之前解决此类问题的方式是inheritedData用于与点击处理程序进行通信,无论它是内在还是外在:
inheritedData
在事物的自定义指令中,使用jqLite数据(例如)将数据变量添加到元素element.data('myThing',true)。如果要在事物的多个实例之间进行区分,则可能需要使用一些唯一生成的密钥。
element.data('myThing',true)
在同一自定义指令中,在document.body的click事件处理程序中,您可以检查 angular.element(event.target).inheritedData('myThing')
angular.element(event.target).inheritedData('myThing')
下面是使用此技术的示例指令
app.directive('thing', function($document,$window) { return { restrict: 'E', template: '<div><span>Inner thing</span></div>', replace: true, link: function(scope,element) { element.data('thing',true); angular.element($document[0].body).on('click',function(e) { var inThing = angular.element(e.target).inheritedData('thing'); if (inThing) { $window.alert('in'); } else { $window.alert('out'); } }) } } });
并可以在此Plunker中看到http://plnkr.co/edit/bRDLcLoesM7Z0BIxKxYu?p=preview