0

Selects (select.js) ドロップリストを ngTable 内に配置し、テーブルの外側から選択を表示しようとすると、スコープが失われ、選択が表示されません。うまくいけば、私はこれを説明することができました。

これがプレビューです。プレビューでは、2 つの出力場所を持つ選択ドロップリストが表示されます。1つはテーブル内で機能し、もう1つはテーブル外で機能しません。

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

4

2 に答える 2

1

私はあなたの問題を解決しましたが、それはスコープのレベルに関係していました。

(まず、なぜ Select コントロールをテーブルの中に入れたのですか? それらはテーブルのデータではないので、<table>タグには入りません。)

ngTable独自のスコープを作成したディレクティブを使用していました。したがって、 Select は次のように 2 つのスコープの下にありました。

[DemoCtrl scope] -> [ngTable scope] -> [Select]

はスコープselectedIconで定義されます。DemoCtrl

よくある問題に遭遇しました。select が を探すとき、selectedIcon継承のレベルを検索して見つけます。したがって、親/祖先スコープのプロパティを読み取ることができます。しかし、それらに書き込むことはできません。代わりに、Select はngTableスコープ上でプロパティを作成/変更しますが、これはスコープ外のバインディングには表示されません。

このため、AngularJS では、 でを使用する代わりにngModel、オブジェクトを参照することをお勧めします。Javascript のオブジェクトは常に参照によるものだからです。だからここに修正があります:

正しくない:

ng-model="selectedIcon"

正しい:

ng-model="obj.selectedIcon"

objDemoCtrlスコープで作成したオブジェクトです。

最初の数段落は、この現象をよく説明しています: https://github.com/angular/angular.js/wiki/Understanding-Scopes

于 2014-01-21T22:28:13.100 に答える
0

できます。これが私がしなければならなかったことです。angular-strap.js を変更する必要がありました。次のコードに scope.$apply() を追加します。

$select.update = function (matches) {
  scope.$matches = matches;
  if (controller.$modelValue && matches.length) {
    if (options.multiple && angular.isArray(controller.$modelValue)) {
      scope.$activeIndex = controller.$modelValue.map(function (value) {
        return $select.$getIndex(value);
      });
    } else {
      scope.$activeIndex = $select.$getIndex(controller.$modelValue);
    }
  } else if (scope.$activeIndex >= matches.length) {
    scope.$activeIndex = options.multiple ? [] : 0;
  }
  scope.$apply();
};
于 2014-01-29T16:13:07.933 に答える