tl:dr
ajax/jsonを使用して「select」フィルタを含むng-tableにデータを入力するにはどうすればよいですか?
問題を示すプランク: http://plnkr.co/Zn09LV
詳細
私は AngualrJS と ng-table 拡張機能を理解しようとしていますが、実際のデータをロードしようとすると、javascript で定義された静的データを使用しているときに、フィルターなどを使用していくつかの素敵なテーブルを取得できます。ひっかかったテーブル。
ng-table の本体は正しく入力されており、テキスト フィルターのみを使用している限り、すべてが機能しているようです。
<td data-title="'Name'" filter="{ 'Name': 'text' }" sortable="'Name'">
{{user.Name}}
</td>
うまく動作します。
ただし、選択フィルターを使用するようにこれを更新すると、次のようになります。
<td data-title="'Name'" filter="{ 'Name': 'select' }" sortable="'Name'" filter-data="Names($column)">
{{user.Name}}
</td>
サーバーからデータが返される前に Names 変数が常に評価されるという同期の問題に遭遇しました。(おそらく、サーバーへのリクエストが送信される前に Names 変数が評価されます。) これは、フィルターの空のリストを取得することを意味します。
データがサーバーから返されると、選択フィルターを更新する方法が見つからないようです。最初にフィルター リストを作成するコードを再実行しても効果がないようです。更新された変数が読み取られないように、フィルターを再チェックするために ng-table をトリガーする方法がわかりません。また、非同期呼び出しが完了するまで変数の評価を延期する方法もわかりません。
私の JavaScript では、ng-table GitHub ページのサンプル ajax コードをほぼ使用し、そこに選択フィルターのサンプル コードを追加しました。
$scope.tableParams = new ngTableParams({
page: 1, // show first page
count: 10, // count per page
sorting: {
name: 'asc' // initial sorting
}
}, {
total: 0, // length of data
getData: function($defer, params) {
// ajax request to api
Api.get(params.url(), function(data) {
$timeout(function() {
// update table params
var orderedData = params.sorting ?
$filter('orderBy')(data.result, params.orderBy()) :
data.result;
orderedData = params.filter ?
$filter('filter')(orderedData, params.filter()) :
orderedData;
$scope.users = orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count());
params.total(orderedData.length); // set total for recalc pagination
$defer.resolve($scope.users);
}, 500);
});
}
});
var inArray = Array.prototype.indexOf ?
function (val, arr) {
return arr.indexOf(val)
} :
function (val, arr) {
var i = arr.length;
while (i--) {
if (arr[i] === val) return i;
}
return -1
};
$scope.names = function(column) {
var def = $q.defer(),
arr = [],
names = [];
angular.forEach(data, function(item){
if (inArray(item.name, arr) === -1) {
arr.push(item.name);
names.push({
'id': item.name,
'title': item.name
});
}
});
def.resolve(names);
return def;
};
追加の $q.defer() を追加し、最初のデータをラップしてから $scope.names 関数を実行する試みをいくつか試みましたが、promise と defer についての私の理解は、何かを機能させるのに十分ではありません。
GitHub には、これが ng-table のバグであることを示唆するメモがいくつかありますが、それが事実なのか、それとも何か馬鹿げたことをしているだけなのかはわかりません。
https://github.com/esvit/ng-table/issues/186
手続き方法についての指針は非常に高く評価されています
-カイネ-