加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

AngularJS ng-repeat内容上的Gridster jQuery插件变坏了

发布时间:2020-12-17 18:01:45 所属栏目:安全 来源:网络整理
导读:我正在尝试将 Gridster与AngularJS集成,但尚未取得太大成功. 阅读Angular UI的ui-jq指令文档,我得到了this (check fiddle)应该有效的印象.但是当我进一步了解Chrome的调试器时,事实证明在this line,它根本找不到任何孩子. 我怀疑在ng-repeat指令的某处,Angul
我正在尝试将 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);
                });
            }
        };
    }
]);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读