4

GridsterをAngularJSと統合しようとしていますが、まだあまり成功していません。

Angular UIのディレクティブに関するドキュメントを読むと、これ(フィドルをチェック)ui-jqが機能するはずだという印象を受けます。しかし、Chromeのデバッガーをもう少し詳しく見てみると、この行では子がまったく見つかりません。

ng-repeatディレクティブのどこかで、AngularJSが繰り返される部分をリッピングすることを決定したのではないかと思います。その理由はわかりますが、それでも問題は解決しません。もう少し先に進むのに役立つ手がかりを歓迎します。

アップデート1

私はそれを指令に変え始めました、それが物事を改善することを望んでいます。ただし、自家製のディレクティブの場合は、ネストng-repeatも邪魔になります。jQueryプラグインの接続を($evalAsync)などできる限り延期しようとしましたが、最終的にはを使用することになりました$timeout。それが私がそれを機能させることができる唯一の方法です。

アップデート2

元のアプローチでは、必要なものが得られなかったと思います。そのため、カスタムディレクティブを実装しました。以下の私の答えを参照してください。

4

4 に答える 4

13

私は最終的にそれに対する独自のディレクティブを書くことになりました。基になるデータへのすべての変更が 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, attrs, 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 ディレクティブによって監視されるコレクションにアイテムが追加または削除されるたびに、グリッドスター制御ビューからアイテムが自動的に追加および削除されます。

編集

以下は、このディレクティブのわずかに変更されたバージョンを示す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, elem, attrs, controller) {
              var options = scope.$eval(attrs.options);
              controller.init(elem, options);
            }
        };
    }
]);

angular.module('ngGridster').directive('gridsterItem', [
    function () {
        return {
            restrict: 'EA',
            require: '^gridster',
            link: function (scope, elm, attrs, controller) {
                controller.addItem(elm);
                elm.bind('$destroy', function () {
                    controller.removeItem(elm);
                });
            }
        };
    }
]);
于 2013-01-25T11:54:06.923 に答える
6

必要に応じて、グリッドスター用の独自のラッパーを試してみることができます。昨夜はほとんど夜を過ごしましたが、少し不具合がありました。gridster がシリアライゼーションを処理する方法は簡単ではありません。とにかく、このプロジェクトに出くわしましたが、非常にうまく機能します。

https://github.com/ManifestWebDesign/angular-gridster

オンラインデモが見つからなかったので、試してみました:

http://plnkr.co/edit/r5cSY1USjtr2bSs7rvlC?p=preview

于 2014-01-07T17:57:36.857 に答える
1

これは、の次のリリースで修正される予定です。

https://github.com/angular-ui/angular-ui/pull/347

新しい遅延属性は、愚かな単体テストに合格しない理由がわかるとすぐに問題を処理します。

于 2013-01-18T10:00:57.027 に答える
0

Angular Gridsterもあります。

Angular での Gridster の実装を調査しているときに、この質問に出くわしました。

于 2014-05-08T11:00:38.640 に答える