1

私は現在、任意の次元の編集可能なテーブルを表示する必要があるプロジェクトに取り組んでいます。私は AngularJS を使用していますが、テーブルが非常に大きくなる可能性があるため、何らかの形式のバインド ワンスを使用しないと処理が遅くなると予想されます。問題は、私が知る限り、bind-once は絶対的なものです。現在編集中の行のすべてのウォッチャーを実際に保持するか、少なくとも元に戻したいのです。

これが私が現在これをどのように行っているかの基本的な考え方です。

<tr ng-repeat="row in rows track by key" hackonce>
  <td ng-repeat="col in cols">
    <div ng-click="editStuff()">{{contents}}

directive('hackonce', function() etc
  link: function(scope, elem, attrs) {
    if (!scope.row.editing)
       setTimeout(function(){ scope.$destroy() }, 0)
  }

行のさまざまな識別子から文字列キーを生成しています。項目に編集フラグが立てられると、コントローラはその項目をコピー用に切り替え、そのキーを変更して、最終的にトランザクション ロック データとなるものを含めます。これにより、ng-repeat で置換がトリガーされ、次に tr が置換された行データで構築されるときに、スコープはそのまま残り、編集時に更新されます。

どういうわけか、それは実際に機能します(とにかく今のところ)。小さなリストの 500 人以上のウォッチャーから 100 人以下に減り、残っているのはほとんどがトップレベルのコントロールなので、うまくスケーリングされることを願っています。また、スコープがなくなっても、ng-clickリスナーなどを保持して適切にクリーンアップしているようです。

しかし、それは私が簡単にタイプするだけでうんざりした一種のハックであり、私よりもこのライブラリをよく知っている正気な人々に嘔吐を誘発する可能性があると感じています. 同じことを行うためのよりクリーンで安全な方法があるかどうか疑問に思っていました。私が探しているのは、条件付きで一度バインドするか、要素/スコープをそれ自体とそのすべての子の $digest をスキップして、公開されたフラグに基づいてスキップするより良い方法です。

ミート クリーバーをスコープに持ち込んだり、Angular で回避したいと思っていたすべての jQuery ガベージを手動で再アタッチしたりしないで、これを行う方法はありますか?

4

1 に答える 1

1

実装の詳細がないと難しいですが、各行の読み取り専用/編集可能な要素を表示/非表示にするメカニズムを使用していると思いますか? これを使用ng-ifすると、要素が DOM にアタッチされ、条件が の場合に再バインドされ、 の場合にtrueデタッチされfalseます。

したがって、次のようなものです:

<td ng-repeat="col in cols">
  <span ng-if="!isEditing(row)">Read-only stuff here</span>
  <span ng-if="isEditing(row)">Editable stuff here.</span>
</td>

ここで本当に簡単なサンプル プランクを作成しました: http://plnkr.co/edit/SkdgTuK5UvEEsZmzWat6?p=preview

于 2015-03-24T02:33:15.070 に答える