0

問題が何であるかはわかりませんが、 $scope が定義される前に datatables ディレクティブが初期化されているようです。さらに、変数が 2 回設定されているようです。

userServiceサーバーから列の定義とデータを取得する があります。getUserList()メソッドは promise を返します。then() メソッドを使用して、datatables ディレクティブで使用される $scope 変数を設定します。リクエストが完了する前に、ディレクティブが変数をリクエストしているようです。また、Chrome の開発コンソールに「テスト」ログが 2 回表示されるため、変数が 2 回設定されているようです。

(サーバーからではなく) 静的データを使用し、 $scope 変数をgetUserList()promise の外に配置すると、正常に動作します。

    $scope.indexList = function () {
                userService.getUserList().then(function (data) {


                    $scope.dtOptions = DTOptionsBuilder.fromFnPromise(function () {
                        console.log("test"); 
                        var deferred = $q.defer();
                        deferred.resolve(data.Data);
                        return deferred.promise;
                    });
                    $scope.dtColumns = [];

                    angular.forEach(data.DataTablesColumns, function (i, v) {
                        $scope.dtColumns.push(DTColumnBuilder.newColumn(i.Id)
                                              .withTitle(i.DisplayName)
                                              .renderWith(actionsHtml));
                    });

                });
            }

これは、datatables ディレクティブを設定する方法です。

    <div ng-init="indexList()">
        <table datatable="" dt-options="dtOptions" dt-columns="dtColumns"class="row-border hover"></table>
    </div>
4

2 に答える 2

1

The directive code is executed as soon as the page loads. And since your $scope variables are defined in the promise, they are not available at the time of page load.

The directive does not wait for the request to complete because requests are async in nature. If you want the directive variable to be updated when the request completes you have to set a $watch(or $watchGroup if you want to watch multiple variables) on the $scope.variables in your link function as follows:

link: function(scope, element, attrs) {
    scope.$watch('dtOptions', function(newval, oldval) {
        //your directive code involving scope variables here.
    })
}
于 2015-10-29T13:01:35.527 に答える
0

私が求めていることを行うには、サーバーに2つの呼び出しを行う必要があるようです。これは機能しますが、サーバーを 1 回呼び出して結果全体を取得する方法が必要だと思います。オプションと列ビルダーを読んだ後、約束を取ることができます。

$scope.indexList = function () {


            $scope.dtOptions = DTOptionsBuilder.fromFnPromise(function () {
                return userService.getUserList(ngRequestGlobabls.context.organization).then(function(data) {
                    return data.Data;
                });
            });


            $scope.dtColumns = userService.getUserList(ngRequestGlobabls.context.organization).then(function (data) {
                columns = [];
                angular.forEach(data.DataTablesColumns, function(i, v) {
                    columns.push(DTColumnBuilder.newColumn(i.Id).withTitle(i.DisplayName).renderWith(actionsHtml));
                });

                return columns;
            });
于 2015-10-29T14:04:50.157 に答える