AngularJS ng-repeat内容上的Gridster jQuery插件变坏了
我正在尝试将
Gridster与AngularJS集成,但尚未取得太大成功.
阅读Angular UI的ui-jq指令文档,我得到了this (check fiddle)应该有效的印象.但是当我进一步了解Chrome的调试器时,事实证明在this line,它根本找不到任何孩子. 我怀疑在ng-repeat指令的某处,AngularJS决定撕掉将要重复的部分,我明白为什么,但这并不能解决我的问题.我会欢迎任何有助于我进一步发展的线索. 更新1 我开始把它变成一个指令,希望这会改善一些事情.但是,嵌套的ng-repeat在本地指令的情况下也会受到妨碍.我尝试推迟连接jQuery插件,只要我能($evalAsync)和类似,并最终使用$timeout.这是我能让它发挥作用的唯一方式. 更新2 我认为最初的方法从来没有给我我需要的东西.因此实现了自定义指令.请参阅下面的答案. 解决方法
我最终最终为它编写了自己的指令.我需要确保gridster可以看到对底层数据的每次更改,但与此同时,我不想在数据模型上编写自己的监视,并用指令替换你在gridster中通常执行的所有操作.隐藏所有这些. (这将涉及在指令本身内实施大部分ng-repeat.)
这就是我所拥有的(并假设“foo”为我的模块的名称): foo.directive "gridster",() -> { restrict: "E" template: '<div class="gridster"><div ng-transclude/></div>' transclude: true replace: true controller: () -> gr = null return { init: (elem) -> ul = elem.find("ul") gr = ul.gridster().data('gridster') return addItem: (elm) -> gr.add_widget elm return removeItem: (elm) -> gr.remove_widget elm return } link: (scope,elem,attrs,controller) -> controller.init elem } foo.directive "gridsterItem",() -> { restrict: "A" require: "^gridster" link: (scope,elm,controller) -> controller.addItem elm elm.bind "$destroy",() -> controller.removeItem elm return } 有了这个,我可以添加一个gridster生成的视图: <gridster> <ul> <li ... ng-repeat="item in ..." gridster-item> <!-- Have something here for displaying that item. --> <!-- In my case,I'm switching here based on some item properties. --> </li> </ul> </gridster> 无论何时在ng-repeat指令观察到的集合中添加或删除项目,它们都将自动添加到gridster控制视图中并从中移除. 编辑 这是一个plunk,展示了该指令的略微修改版本: angular.module('ngGridster',[]); angular.module('ngGridster').directive('gridster',[ function () { return { restrict: 'E',template: '<div class="gridster"><div ng-transclude/></div>',transclude: true,replace: true,controller: function () { gr = null; return { init: function (elem,options) { ul = $(elem); gr = ul.gridster(angular.extend({ widget_selector: 'gridster-item' },options)).data('gridster'); },addItem: function (elm) { gr.add_widget(elm); },removeItem: function (elm) { gr.remove_widget(elm); } }; },link: function (scope,controller) { var options = scope.$eval(attrs.options); controller.init(elem,options); } }; } ]); angular.module('ngGridster').directive('gridsterItem',[ function () { return { restrict: 'EA',require: '^gridster',controller) { controller.addItem(elm); elm.bind('$destroy',function () { controller.removeItem(elm); }); } }; } ]); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |