Selects (select.js) ドロップリストを ngTable 内に配置し、テーブルの外側から選択を表示しようとすると、スコープが失われ、選択が表示されません。うまくいけば、私はこれを説明することができました。
これがプレビューです。プレビューでは、2 つの出力場所を持つ選択ドロップリストが表示されます。1つはテーブル内で機能し、もう1つはテーブル外で機能しません。
Selects (select.js) ドロップリストを ngTable 内に配置し、テーブルの外側から選択を表示しようとすると、スコープが失われ、選択が表示されません。うまくいけば、私はこれを説明することができました。
これがプレビューです。プレビューでは、2 つの出力場所を持つ選択ドロップリストが表示されます。1つはテーブル内で機能し、もう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"
obj
DemoCtrl
スコープで作成したオブジェクトです。
最初の数段落は、この現象をよく説明しています: https://github.com/angular/angular.js/wiki/Understanding-Scopes
できます。これが私がしなければならなかったことです。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();
};