Назначить переменные $ scope внутри обещания then для директивы angular datatables?

0

Я не уверен, в чем проблема, но кажется, что директива datatables инициализируется до того, как будет определена моя область. Что еще, кажется, переменные устанавливаются дважды.

У меня есть userService который извлекает определения столбцов и данные с моего сервера. Метод getUserList() возвращает обещание. Я использую метод then() для установки переменных $ scope, которые будут использоваться директивой datatables. Кажется, что директива запрашивает переменные до завершения запроса. Кроме того, кажется, что переменные устанавливаются дважды, потому что в консоли Chrome dev я дважды вижу тестовый журнал.

Если я использую статические данные (не исходящие от сервера) и getUserList() переменные $ scope за пределы getUserList() они отлично работают.

    $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>
Теги:
datatables
angular-datatables

2 ответа

1
Лучший ответ

Код директивы выполняется, как только загружается страница. И поскольку ваши переменные $ scope определены в обещании, они недоступны во время загрузки страницы.

Директива не ждет завершения запроса, поскольку запросы являются асинхронными по своей природе. Если вы хотите, чтобы переменная директивы обновлялась после завершения запроса, вы должны установить $watch (или $ watchGroup, если хотите просмотреть несколько переменных) в переменной $ scope.variables в своей функции ссылок следующим образом:

link: function(scope, element, attrs) {
    scope.$watch('dtOptions', function(newval, oldval) {
        //your directive code involving scope variables here.
    })
}
  • 0
    Могу ли я сделать что-то подобное без изменения директивы?
  • 0
    Я не вижу другого пути ... Может быть, какая-то отложенная инициализация директивы, но я не знаю, возможно ли это.
0

Кажется, мне нужно сделать 2 звонка на мой сервер, чтобы делать то, что мне нужно. Это работает, но я чувствую, что должен быть способ сделать один звонок на сервер и получить тогда полный результат. После некоторого чтения варианты и построители столбцов могут пообещать.

$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;
            });

Ещё вопросы

Сообщество Overcoder
Наверх
Меню