通用功能包装成指令
通用功能包装成指令
我正在尝试编写一个指令,能够在应用程序的任意位置对任意数据进行排序。假设我有以下代码(基于实际代码,为简单起见只显示排序函数和一些复杂性):\n
angular.module('test', []); angular.module('test').controller('wrapperController',['$scope', function(scope){ scope.data = {} scope.data.rows = [{name: 'foo'}, {name: 'bar'}, {name: 'bazz'}] scope.data.columns = [{name: 'Name', sortBy: 'name'}] }]); angular.module('test').directive('grid', [function(){ return { restrict: 'A', templateUrl: 'grid.html', scope: { grid: '=' } } }]); angular.module('test').directive('sortable', [function(){ return { restrict: 'A', scope: { sortableCollection: '=', sortableKey: '&' }, compile: function(el, at, transclude){ if(at['ng-click']){ el.attr('ng-click', el.attr('ng-click')+';sortFunction()') }else{ el.attr('ng-click', 'sortFunction();') } return(function(scope, element, attrs){ scope.sortableKey = scope.sortableKey(); scope.sortFunction = function(){ alert(" I AM IN UR FUCNTION SORTING UR D00dZ!!1"); } }); } } }]);
\n还有以下HTML代码:\n
\n以及(在`grid.html`中):\n
{{column.name}} |
{{row.name}} |
\n检查HTML代码显示`ng-click`正确填充,但是当点击标题时,函数从未触发。为什么会这样?有没有办法实现这种行为?\nplunr:[http://plnkr.co/edit/aXjMqhZxI7ME8wQJOLpA?p=preview](http://plnkr.co/edit/aXjMqhZxI7ME8wQJOLpA?p=preview)
问题的出现原因是,网格指令需要在其范围内创建一个控制对象,并将其传递给可排序指令。然而,由于作用域的特性,无法直接在指令之间共享控制对象。
为了解决这个问题,可以通过在网格指令中创建一个控制对象,并通过属性传递给可排序指令。可排序指令会将排序函数添加到控制对象中。最后,在网格模板中,可以通过控制对象的属性来访问排序函数。
以下是解决方法的代码示例:
网格指令中的代码:
link: function(scope, element, attrs) { scope.sorter = {}; }
网格模板中的代码:
可排序指令中的代码:
scope: { .... sortControl: '=' }, link: function(scope, element, attr) { if (scope.sortControl) { scope.sortControl = { sortFunction: function() { alert(" I AM IN UR FUCNTION SORTING UR D00dZ!!1"); } }; } }
网格模板中的代码:
通过以上解决方法,可以实现网格指令和可排序指令之间的通信,并在网格模板中调用控制对象中的排序函数。
以上是一个可运行的示例,您可以通过此链接查看演示效果。这种方法非常实用,可以在以后的开发中参考使用。感谢原作者提供的解决方案!
问题的原因是在Angular应用启动时,它会扫描DOM以查找指令,并调用它们的编译函数。因此,在编译函数中添加`ng-click`指令已经太晚了。另外,在指令中添加`ng-click`也没有意义,因为您想要添加的是一个点击事件的监听器。
解决方法是在指令的链接函数中添加一个点击事件的监听器。代码示例如下:
link: function(scope, element, attrs) { scope.sortableKey = scope.sortableKey(); element.on('click', function() { alert(" I AM IN UR FUCNTION SORTING UR D00dZ!!1"); // 在修改模型后调用$scope.$apply(); }); }
这样,当元素被点击时,将会弹出一个警告框。如果您修改了模型数据,需要在修改后调用`$scope.$apply()`来通知Angular更新视图。