Ng-table: Ошибка: settings. $ Scope. $ Emit не является функцией

Созданный на 29 апр. 2014  ·  50Комментарии  ·  Источник: esvit/ng-table

Привет, просто хотел начать с того, что сказал, насколько я ценю этот проект и ту работу, которая в него вложена.

В любом случае, у меня действительно странная ошибка. В принципе, я могу запустить $scope.tableParams.reload() дважды без проблем, но при третьем выполнении и каждом следующем я получаю следующую ошибку:

TypeError: Cannot set property '$data' of null at [removed]/ng-table.js:411:55

Я считаю, что это весь соответствующий код, но если чего-то не хватает, дайте мне знать:

$scope.lookupAddress = function(address){       
    var url = 'https://blockchain.info/multiaddr?cors=true&active='+address;
    $scope.loading = true;
    $scope.clearTableData();
    $http.get(url).success(function(data){
        $scope.loading = false;
        $scope.loaded = true;
        $scope.loadError = false;
        glob = data;

        //Removed code that processes the response. 

        };
        //Enables new data to be loaded, e.g. on a new address.
        //Pretty sure it's not working right now.
        if ($scope.tableParams){
            $scope.tableParams.reload();
        } 
        data = transactions; //this data var is what is called by the tables. Unsure if can remove.
        $scope.tableParams = new ngTableParams({
            page: 1,            
            count: 5,           // items per page
            sorting: {
                Date: 'desc' 
            }
        }, {
            total: transactions.length, 
            getData: function($defer, params) {
                data = transactions;
                var orderedData = params.sorting() ? $filter('orderBy')(data, params.orderBy()) : data;
                $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));

            }
        });
    }).
    error(function(data){
        $scope.loadError = true;
    });
}

$scope.clearTableData = function(){
    transactions = [];
    $scope.output = {}
    if ($scope.tableParams){
            $scope.tableParams.reload();
    } 
}

Все 50 Комментарий

Я провел дополнительное расследование.

Кажется, что скорость обратного вызова для третьего мгновенная, тогда как для первых двух есть задержка.

Добавив console.log(data) в строку 406, я заметил следующее поведение:
(редактировать: не удалось реализовать # ссылки на проблемы в Github. Не обращайте внимания.)

  1. Возвращает [] при загрузке страницы (без данных в таблице)
  2. После вызова функции $ scope.lookupAddress () fn, которую я написал, она регистрирует данные, как и ожидалось, через некоторое время после вызова (то есть после срабатывания событий $ http.get (). Success (), что занимает несколько секунд).
  3. При повторном вызове шаги №1 и №2 повторяются по порядку. №1 срабатывает сразу, а №2 с такой же задержкой.
  4. Здесь начинается ошибка. Сначала срабатывает №1, затем ошибка, описанная в предыдущем посте. Только после того, как ошибка была запущена, срабатывает №2.

После №4 таблица не перезагружается, но данные загружаются в бэкэнд правильно. Кроме того, хотя я не могу вызвать .reload() не получив сообщения об ошибке, если я отсортирую любой из столбцов, он правильно обновит данные в таблице.

Вау, чем больше я копаю, тем более странной становится эта ошибка.

Добавьте это в ngTableParams: $scope: { $data: {} }

согласно примеру 14 по адресу: http://bazalt-cms.com/ng-table/example/14

Спасибо, что нашли время помочь.

Я просмотрел код и сделал, как вы сказали. Проблема не исчезла, но ошибка изменилась. Теперь в третий раз говорится:

TypeError: undefined is not a function at [...]/ng-table.js:414:33

Чтобы было ясно, вот эта строка:

settings.$scope.$emit('ngTableAfterReloadData');

Похоже, что теперь, когда для $ scope установлено значение undefined, вызов метода не работает.

Есть ли причина, по которой $ scope.tableParams определяется внутри обратного вызова $ http.get (). Success (), а не в функциональном блоке контроллера?

Функция $ http.get (). Success () находится в функциональном блоке контроллера. Причина наличия $ scope.tableParams в том, что ему нужен доступ к данным, возвращаемым $ http.get (). Success ().

Вы бы поступили иначе? Стоит ли использовать обещания? Я просмотрел как пример, который вы связали, так и пример AJAX, но не смог собрать его воедино.

Похоже, проблема в области видимости. Попросите success() обновить свойство контроллера с результатами. Это даст вам ссылку на разрешение этих результатов для ngTable вне success() .

$scope.transactions = [];

$scope.lookupAddress = function (address) {
  var url = 'https://blockchain.info/multiaddr?cors=true&active=' + address;
  $http.get(url).success(function (data) {
    $scope.transactions = data;
    $scope.tableParams.reload();
  });
};

$scope.tableParams = new ngTableParams({
  page: 1,            
  count: 5,
  sorting: {
      Date: 'desc' 
  }
}, {
  total: $scope.transactions.length, 
  getData: function($defer, params) {
    var data = $scope.transactions;
    var orderedData = params.sorting() ? $filter('orderBy')(data, params.orderBy()) : data;

    $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
  }
});

Еще раз спасибо за помощь в этом. Я работал над этой проблемой весь день, и, надеюсь, я ближе к решению.

Итак, как и в других потоках, которые я видел на GitHub и StackOverflow относительно ngTables, я реорганизовал свой код, чтобы использовать обещания вместо $ http.get (). Success (). Итак, вот как это выглядит сейчас:

$scope.transactions = [];
$scope.callBlockchain = function(address) {
    var url = 'https://blockchain.info/multiaddr?cors=true&active='+address;
    var promise = BlockchainService.lookupAddress(url);
    promise.then(function(data){
        $scope.transactions = data;
        $scope.tableParams.reload();
    })

$scope.tableParams = new ngTableParams({
    page: 1,            
    count: 5,           // items per page
    sorting: {
        Date: 'desc' 
    }
}, {
    total: $scope.transactions.length, 
    getData: function($defer, params) {
        var data = $scope.transactions;
        var orderedData = params.sorting() ? $filter('orderBy')(data, params.orderBy()) : data;
        $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));

    },
    $scope: { $data: {} }
})

Когда я запускаю это, я получаю сообщение об ошибке «undefined не является функцией», которая ссылается на строку 414 файла ng-table.js . В частности, он ссылается на столбец 33, который является правильным при вызове метода $ emit.

Если я удалю $ scope.tableParams.reload (), ошибка исчезнет, ​​но таблица не обновится. Написание if ($scope.tableParams){$scope.tableParams.reload();} тоже не помогает решить проблему.

edit: Поскольку ошибка «undefined is not a function» появляется через полсекунды после вызова функции, я предполагаю, что ошибка срабатывает только после того, как обещание разрешено (т.е. это не связано с попыткой преждевременно разрешить данные в обещании).

изменить 2: Если я console.log () settings.$scope (объект, который вызывает метод $ emit (), который возвращает undefined), я получаю интересное поведение. При первой загрузке страницы регистрируется объект, который выглядит как обычный объект для работы модуля. Однако после того, как обещание в callBlockchain () fn разрешается, регистрируется другой объект, который содержит данные, которые я пытаюсь представить в данных.

Может быть, это та проблема, о которой вы говорили? Кажется, что каким-то образом данные настройки для таблицы перезаписываются данными содержимого.

У меня была такая же проблема, как и у вас, пока я не понял этого.

У меня есть шаблон, который выглядит примерно так:

<div ng-controller="MyController">
  <!-- an HTML form here... -->
  <button ng-click="save()" >Save and Reload</button>
</div>
<div ng-controller="MyController">
  <table ng-table="tableParams">
  <!-- my table code here... -->
  </table>
</div>

Внутри MyController меня есть функция $scope.save которая сохраняет новый элемент в службу и запускает $scope.tableParams.reload() , а также классическую $scope.tableParams = new ngTableParams(... . После того, как я несколько часов ломал себе голову с этой проблемой и читал код ngTable снова и снова, я обнаружил, что у меня в основном проблема с $ scope: 2 независимых ngTableParams, один без действительных настроек. $ Scope (один на моем контроллере) и другой один с допустимыми настройками. $ scope (тот, который находится внутри ngTableController). Когда ngTable вызывает перезагрузку после разбиения на страницы или любого другого взаимодействия, он использует хороший (тот, с допустимыми настройками. $ Scope), НО, когда я пытался перезагрузить таблицу вручную, я вызывал ее извне.

После понимания того, как ngTable работает внутренне, это было очень просто исправить, создав экземпляр ngTableParams как новую фабрику и вставив его в контроллер; Таким образом, я на 100% уверен, что экземпляр ngTableParams всегда такой же, как и я.

В качестве побочного примечания НЕ рекомендуется устанавливать $scope: {$data: {}} потому что это недопустимый объект $ scope, а также потому, что каждый раз, когда параметры таблицы меняются (например, при переходе на другую страницу), ngTableController будет переопределите его собственной $ scope, вы можете увидеть, что здесь

После понимания того, как ngTable работает внутренне, это было очень просто исправить, создав экземпляр ngTableParams как новую фабрику и вставив его в контроллер; Таким образом, я на 100% уверен, что экземпляр ngTableParams всегда такой же, как и я.

@erickrdch Не могли бы вы уточнить это с помощью кода.

Мой HTML:

<table class="table table-condensed table-hover" ng-table="tableParams">
<!--- table stuff --->
</table>

В моем контроллере я сейчас делаю это:

if (batch.rules) {
      $scope.tableParams = new ngTableParams({
          page: 1,            // show first page
          count: 25,          // count per page
          sorting: {
            created: 'desc'     // initial sorting
          }
        },
        {
          total: batch.rules.length, // length of data
          getData: function ($defer, params) {

            // use build-in angular filter
            var filteredData = $filter('filter')(batch.rules, $scope.filter);
            var orderedData = params.sorting() ?
              $filter('orderBy')(filteredData, params.orderBy()) :
              filteredData;

            $scope.rules = orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count());

            params.total(orderedData.length); // set total for recalc pagination
            $defer.resolve($scope.rules);
          }
        }
      );

$scope.$watch('filter.$', function () {
    $scope.tableParams.reload(); // TODO: Fix {scope: null} racecondition
});

Благодаря вашему сообщению я понял, что $ scope.tableParams.reload () вызывает ошибку. Но как мне это решить.

Та же проблема. Наблюдайте за набором данных, который вызывает $ scope.tableParams.reload ();

$ scope.tableParams.reload () дает Cannot set property '$data' of null при первом запуске часов (в параметрах таблицы нет существующих данных). Последующие звонки в порядке.

Я только что нашел уродливое, но эффективное решение.
Оберните $ scope.watch в $ timeout следующим образом:

$timeout( // Fix scope: null racecondition
  function(){
    $scope.$watch('filter.$', function () {
      $scope.tableParams.reload(); 
    });
  },
  0
);

Я считаю, что эта проблема вызвана состоянием гонки между выполнением обещания в функции getData() и слишком ранним вызовом tableParams.reload() до завершения обещания. Я изменил свой код при вызове перезагрузки, и, похоже, он работает нормально:

  if ($scope.tableParams.data.length > 0) {
    $scope.tableParams.reload();
  }

Кстати, я не использовал $scope: { $data: {} } при определении своей таблицы.

Спасибо за отличную библиотеку.

Есть ли решение этой проблемы?

У меня также была такая же проблема, и через 2 дня борьбы мне удалось исправить ее, используя следующую строку кода сразу после

$scope.tableParams = new ngTableParams(
{...},
{...}
);
 $scope.tableParams.settings().$scope = $scope;

Для получения дополнительной информации см. Https://github.com/esvit/ng-table/blob/master/src/scripts/04-controller.js#L33.

Была такая же проблема.
Решение Хаси исправило это довольно легко.
Спасибо!

Я тоже нашел, что решение Хаси работает. Однако, учитывая количество людей, сталкивающихся с этой ошибкой, можно ли внести изменения в сам ngTable, чтобы все работало так, как ожидалось? В примере 14 просто не требуется обходной путь ngTableParams: $scope: { $data: {} } . Есть мысли по поводу этого @esvit?

Прежде всего, большое спасибо команде ngTable за отличную работу: +1:
Что касается этой проблемы, у меня тоже сработало решение hasi'e. Однако, как также упомянул kbaltrinic, было бы неплохо иметь исправление для этой проблемы.

Я целый день ломал себе голову .. Спасибо, erickrdch и hasi!

У меня та же проблема, но я не могу собрать воедино все фрагменты решения для работы :(. Теперь я дошел до стадии, когда я получаю ошибку ng-table.js: 414, в которой $ emit не определено. В частности, это остановка создания кода выбора страницы (я думаю, что-то есть). Есть ли у кого-нибудь окончательный пример решения после исправления, например, plunkr? Спасибо

Нет ничего лучше, чем опубликовать вопрос, а затем найти ответ через несколько секунд. Теперь это работает для меня:

$scope.activityParams = new ngTableParams({
    page: 1,            // show first page
    count: 10           // count per page
}, {
    total: 0, // length of data
    counts: [],
    getData: function ($defer, params) {
        params.total($scope.activities.length);
        $defer.resolve($scope.activities.slice((params.page() - 1) * params.count(), params.page() * params.count()));
    },
});
$scope.activityParams.settings().$scope = $scope;

В частности, последняя строка предотвращает неопределенность $ emit (проблема строки 414). И params.total ($ scope.activities.length) заставляет длину правильно обновляться, когда мой сервер обновляет значения $ scope.activities

Я добавлю свое конкретное решение. Для всех, кто нуждается / для получения предложений по его улучшению.
Требуется перезагрузка после добавления или удаления из исходного массива.

$scope.$watch('assets.length', function () {
  if ($scope.tableParams.settings().$scope) {
    $scope.tableParams.reload(); 
  }
});

$scope определяется в ngTableController , я подумал, что дождусь их. Для меня это только ошибка при начальной загрузке, возможно, reload вызывается до инициализации контроллера?

Несколько часов бился над вопросом. Наконец, вот код, который мне подходит. Возможно, это кому-то поможет:

'use strict'

angular.module 'aApp'
.controller 'ScenariosCtrl', ($scope, $modal, $filter, ngTableParams, Api) ->

  $scope.scenario = {}
  $scope.scenarios = []

  fetch = ->
    Api.getTestScenarios()

    .then (collection) ->
      $scope.scenarios = collection

      if $scope.tableParams?
        $scope.tableParams.total $scope.scenarios.length
        $scope.tableParams.reload()
      else
        pager = page: 1, count: 10
        items =
          total: $scope.scenarios.length
          getData: ($defer, params) ->
            data = $scope.scenarios
            orderedData = if params.sorting() then $filter('orderBy')(data, params.orderBy()) else data
            $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()))

        $scope.tableParams = new ngTableParams pager, items
        $scope.tableParams.settings().$scope = $scope

  $scope.newScenario = ->
    modal = $modal.open
      templateUrl: 'app/scenarios/modal-scenario.html'
      scope: $scope
      resolve:
        scenario: ->
          $scope.scenario

    modal.result
    .then ->
      Api.createTestScenario $scope.scenario
      .then (data) ->
        $scope.scenario = {}
        fetch()

    , ->
      $scope.scenario = {}

  fetch()

Мне удалось обойти эту проблему, используя $timeout в моем методе $watch

  $scope.$watch("transactions", function (n, o) {
    $timeout(function(){ $scope.table.reload(); });
  });

Здравствуй,

Я использовал решение Hasi и теперь не получаю никаких сообщений об ошибке.

settings.$scope.$emit('ngTableAfterReloadData');

но теперь я столкнулся с другой проблемой. Как-то не обновляется панель пагинации.
В моем случае данные загружаются динамически. При первой загрузке данных он вычисляет правильные страницы и показывает панель нумерации страниц. Но после этого панель пагинации не меняется, хотя данные меняются.

Когда я отлаживал код, я обнаружил, что следующий код не вызывается.

scope.params.settings().$scope.$on('ngTableAfterReloadData', function () {
                    scope.pages = scope.params.generatePagesArray(scope.params.page(), scope.params.total(), scope.params.count());
                }, true);

У кого-нибудь есть какие-нибудь подсказки? Заранее спасибо.

эй, у меня такая же проблема. Я использовал решение Hasi и теперь не получаю никаких сообщений об ошибке.
но данные таблицы не обновляются. потому что этот блок кода не выполняется.

 scope.params.settings (). $ scope. $ on ('ngTableAfterReloadData', function () {
 scope.pages = scope.params.generatePagesArray (scope.params.page (), scope.params.total (), scope.params.count ());
 }, истинный);

есть хоть какое-то представление об этой сложной проблеме?

Нажатие на эту обходной путь

Я пробовал все предложенные здесь решения, но ни одно из них не помогло мне решить мою проблему.
Мы очень ценим любые комментарии по этому поводу.
Чтобы узнать о проблеме, перейдите по ссылке:
http://stackoverflow.com/questions/28081205/ngtable-not-loading-data

Кто-нибудь, какие-нибудь предложения или что-нибудь по этому поводу? Кто-нибудь отслеживает эту тему?

Это не поможет напрямую, но мое решение заключалось в том, чтобы отказаться от angular (особенно с учетом недавно объявленной дорожной карты) и использовать knockout. Я должен сказать, что это было гораздо менее болезненно.

У меня нет возможности отказаться от Angular. Это нужно делать только с использованием AngularJS. Я пробовал много сообщений и предложений, но, похоже, ни один из них не работает.

@ nick250386 - поскольку причины проблемы могут быть

Я согласен с тем, что полное удаление angular над табличным модулем вряд ли будет решением для многих; приложения могут быть довольно сильно развиты и находятся на пути к завершению.

Я тоже перепробовал все возможные хаки, но ни один из них не работает.
Иногда (1 из 8) таблица обновляется правильно при вызове reload (), еще 7 раз я продолжаю получать:

TypeError: undefined не является функцией над:
настройки. $ scope. $ emit ('ngTableAfterReloadData');

В настоящее время я использую v0.4.3, есть ли предложения о том, как перезагрузить таблицу при изменении данных?

У меня такая же проблема, ни один из взломанных здесь не работает.
Только некоторая перезагрузка работает корректно.

Стол вообще нельзя использовать.

Вы пробовали работать в Chrome внутри инструментов разработчика с включенной функцией «останавливать при необработанных исключениях» и проверять, где именно находится попытка вызова функции? Это может быть не там, где вы думаете ...

Спасибо @OracPrime, это результат исключения:

: TypeError: undefined не является функцией
сообщение: "undefined не является функцией"
stack: "TypeError: undefined не является функцией
по адресу http: // localhost : 8000 / js / libs / angular / ng-table.min.js: 455: 33
в l.promise.then.J (http: // localhost: 8000 / js / libs / angular / angular-1.2.28.min.js: 101: 96)
по адресу http: // localhost : 8000 / js / libs / angular / angular-1.2.28.min.js: 102: 259
в h. $ get.h. $ eval (http: // localhost: 8000 / js / libs / angular / angular-1.2.28.min.js: 113: 32)
в h. $ get.h. $ digest (http: // localhost: 8000 / js / libs / angular / angular-1.2.28.min.js: 110: 117)
в h. $ get.h. $ apply (http: // localhost: 8000 / js / libs / angular / angular-1.2.28.min.js: 113: 362)
в HTMLDivElement.(http: // localhost: 8000 / js / libs / angular / angular-1.2.28.min.js: 195: 229)
в HTMLDivElement.x.event.dispatch (http: // localhost: 8000 / js / libs / jquery-2.0.2.min.js: 4: 9843)
в HTMLDivElement.x.event.add.y.handle (http: // localhost: 8000 / js / libs / jquery-2.0.2.min.js: 4: 6633) "

Строка 455:

settings.$scope.$emit('ngTableAfterReloadData');

Проблема в том, что я не могу обновить таблицу при изменении данных, у меня та же проблема с @Evilcry , иногда она работает (в большинстве случаев), иногда нет. Это мой код:

$scope.tableParams = new ngTableParams({
                        page: 1,
                        count: 25,
                        filter: { },
                        sorting: { "date": "desc" } }, {
                        filterDelay: 200,
                        counts: [],
                        total: data.length,
                        getData: function($defer, params) {
                            $defer.resolve(data.slice((params.page() - 1) * params.count(), params.page() * params.count()));
                        },
                        $scope: { $data: {} }
                    });

При изменении данных я просто выдаю:

$scope.tableParams.reload();

Редактировать
Из-за ограничений по времени в моем текущем проекте я просто переключился на trNgGrid: http://moonstorm.github.io/trNgGrid/release/index.html Мне удалось преобразовать весь проект менее чем за час, и он отлично работает слишком далеко.

У кого-нибудь была возможность разобраться в этом? Я проверил так много результатов в Google по этому поводу, и во многих местах люди сталкиваются с одной и той же проблемой. В одном сценарии нужно было загрузить 3 таблицы, что я смог сделать без каких-либо проблем. В моем проблемном случае первая таблица загружается без каких-либо проблем. Исходя из данных, представленных в первой строке таблицы, данные необходимо загрузить во вторую таблицу. Я могу получить новые данные для второй таблицы, но эти данные не отображаются. Я перепробовал все решения, представленные в Интернете, но, похоже, ни одно из них не работает. Для справки вы можете обратиться к деталям моего дела по адресу:

http://stackoverflow.com/questions/28081205/ngtable-not-loading-data

Любые идеи по этой теме приветствуются.

Всякий раз, когда я пытаюсь перезагрузить таблицу (внутри наблюдателя) после получения необходимых данных, я получаю сообщение об ошибке:
TypeError: невозможно установить для свойства $ data значение null
Я дополнительно исследовал проблему. Вот что я нашел:
Раньше, когда для таблицы нет данных:

{"data":[],"$params":{"page":1,"count":10,"filter":{"location":"","country":"","region":""},"sorting":{"location":"asc"},"group":{},"groupBy":null},"filterBuffer":{}}

После запуска часов соответствующая переменная загружается данными (это подтверждено), но параметры таблицы остаются неизменными:

{"data":[],"$params":{"page":1,"count":10,"filter":{"location":"","country":"","region":""},"sorting":{"location":"asc"},"group":{},"groupBy":null},"filterBuffer":{}}

Есть идеи, почему это происходит

Я обновил свой код на основе изменений, внесенных в мой предыдущий комментарий с журналами консоли. Не стесняйтесь задавать любые вопросы.
http://stackoverflow.com/questions/28081205/ngtable-not-loading-data

Хорошо .. Я получил это, чтобы работать с комбинацией вышеупомянутых решений плюс еще одна вещь. Я использовал как исправление hasi

$ scope.tableParams.settings (). $ scope = $ scope; чтобы избавиться от ошибки

и от joseym:

$ scope. $ watch ("mygriddatavar", function (n, o) {
$ timeout (function () {$ scope.tableParams.reload ();});
});

ОДНАКО мне пришлось использовать два отдельных контроллера. Мое приложение выполняет поиск, и я перечисляю результаты в таблице. Этот вызов $ http был выполнен в одном контроллере, результаты были возвращены, а ответ JSON был сохранен в $ scope.mygriddatavar. Я создал свои tableParams в отдельном контроллере и добавил часы сверху также в этот контроллер. Я не уверен, почему это работает, но я пробовал все на одном контроллере, и он никогда не работал. Это заработало только после создания отдельного контроллера для таблицы. Это выглядит примерно так:

.controller('mainController',['$scope','$route', '$animate', '$http'','ngTableParams', function($scope,$route, $animate,$http,ngTableParams) {
...blah...blah...
  $scope.searchFunc = function(){
                         var getsearchres = {
                                        url: mysearchapi,
                                        method: 'post',
                                        data : somedata

                            };
                            $http(getsearchres )
                                      .success(function(data, status, headers, config) {

                                            $scope.mygriddatavar= data;


                                  })
                                  .error(function(data, status, headers, config) {

                                           $scope.alert = 'There was a network error. Try again later.';

                                    })
}
}])
.controller('searchControl', function($scope,$http, $filter, $timeout, ngTableParams) {

$scope.$watch('mygriddatavar', function(n,o){
                    if($scope.tableParams){
                      $timeout(function(){ $scope.tableParams.reload(); });
                     }
                }
             );

    $scope.tableParams = new ngTableParams({
        page: 1,            // show first page
        count: 10,          // count per page
        filter: {
            //Internal_ID: ''       // initial filter
        },
        sorting: {
            Internal_ID: 'asc'     // initial sorting
        }
    }, {
        total: $scope.mygriddatavar.length, // length of data
        getData: function($defer, params) {
            data = $scope.mygriddatavar;
            //use build-in angular filter
            var filteredData = params.filter() ?
                    $filter('filter')(data, params.filter()) :
                    data;
            var orderedData = params.sorting() ?
                    $filter('orderBy')(filteredData, params.orderBy()) :
                    filteredData;

            params.total(orderedData.length); // set total for recalc pagination
            $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
        },
        $scope: { $data: {} }
    });

    $scope.tableParams.settings().$scope = $scope;
})

Я действительно думаю, что эти трудности можно было бы легче решить с помощью PROPER
ДОКУМЕНТАЦИЯ API вместо того, чтобы просеивать случайные примеры кода и
надеюсь на лучшее ...

_Josey Телефон: 918.926.6678 | Gtalk: [email protected] [email protected]
Twitter: @joseym http://www.twitter.com/joseym LinkedIn: Джози Мортон
http://www.linkedin.com/profile/view?id=59813483 Github: joseym
http://www.github.com/joseym Блог: Tumblr http: //tumblr.joseymorton.com_

29 января 2015 г. в 9:45 cscrum [email protected] написал:

Хорошо .. Я получил это, чтобы работать с комбинацией вышеуказанных решений плюс один
еще вещь. Я использовал как исправление hasi

$ scope.tableParams.settings (). $ scope = $ scope; чтобы избавиться от ошибки

и от joseym:

$ scope. $ watch ("mygriddatavar", function (n, o) {
$ timeout (function () {$ scope.tableParams.reload ();});
});

ОДНАКО мне пришлось использовать два отдельных контроллера. Мое приложение выполняет
поиск, и я перечисляю результаты в таблице. Вызов $ http был сделан за один
контроллер, возвращенные результаты и ответ JSON были сохранены в
$ scope.mygriddatavar. Я создал свои tableParams в отдельном контроллере и
добавили часы сверху также в этот контроллер. Я не уверен, почему это
работает, но я пробовал все на одном контроллере, и он никогда не работал. Это было
только после создания отдельного контроллера для таблицы, чтобы он работал. Так
это выглядит примерно так:

.controller ('mainController', ['$ scope', '$ route', '$ animate',
'$ http' ',' ngTableParams ', функция ($ scope, $ route,
$ animate, $ http, ngTableParams) {
... бла ... бла ...
$ scope.searchFunc = function () {
var getsearchres = {
url: mysearchapi,
метод: 'post',
данные: somedata

                    };
                    $http(getsearchres )
                              .success(function(data, status, headers, config) {

                                    $scope.mygriddatavar= data;


                          })
                          .error(function(data, status, headers, config) {

                                   $scope.alert = 'There was a network error. Try again later.';

                            })

}
}])
.controller ('searchControl', функция ($ scope, $ http, $ filter, $ timeout,
ngTableParams) {

$ scope. $ watch ('mygriddatavar', function (n, o) {
if ($ scope.tableParams) {
$ timeout (function () {$ scope.tableParams.reload ();});
}
}
);

$ scope.tableParams = new ngTableParams ({
page: 1, // показать первую страницу
count: 10, // количество на странице
filter: {
// Internal_ID: '' // начальный фильтр
},
сортировка: {
Internal_ID: 'asc' // начальная сортировка
}
}, {
total: $ scope.mygriddatavar.length, // длина данных
getData: function ($ defer, params) {
данные = $ scope.mygriddatavar;
// использовать встроенный угловой фильтр
var filterData = params.filter ()?
$ filter ('фильтр') (данные, params.filter ()):
данные;
var orderData = params.sorting ()?
$ filter ('orderBy') (filterData, params.orderBy ()):
filterData;

    params.total(orderedData.length); // set total for recalc pagination
    $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
},
$scope: { $data: {} }

});

$ scope.tableParams.settings (). $ scope = $ scope;

})

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/esvit/ng-table/issues/297#issuecomment -72046727.

: +1: для исправления ошибки

@joseym, как вы думаете, мы можем использовать этот код в качестве основы для документирования обходного пути, пока не будет исправлена ​​ошибка? https://github.com/esvit/ng-table/blob/master/src/scripts/04-controller.js#L23 -L30 (L30, на мой взгляд, текущий обходной путь)

это правда closed ? :-П

Я более чем счастлив задокументировать обходной путь в качестве временного «решения», упомянутого в моем последнем комментарии, но даже в этом случае проблема должна оставаться открытой.

Почему закрываются все эти открытые и нерешенные проблемы?

дать точное описание, указав угловую версию, версию ng-table.

дайте возможность воспроизвести вашу проблему, лучше всего с работающим примером, вы можете использовать plunkr. Обратите внимание: если вы хотите имитировать загрузку ajax, вы можете использовать службу $ timeout angular или $ httpBackend.

@iyel Я могу заняться этим на выходных, когда у меня будет немного времени. Я считаю, что лучше всего было бы 2 плункера: 1 для отображения ошибки (таким образом формально изолируя ее [0]) и 1 для отображения текущего обходного пути. Затем я пошлю небольшой PR для README [1], чтобы иметь область «Известные проблемы» со ссылкой на плункеры и некоторый контекст.

[0] это позволит закрыть эту проблему и открыть более конкретную проблему, которая может сосредоточиться на решении конкретной проблемы.

[1] Спасибо, что обновили файл readme и добавили в него рекомендации ... очень важно для больших проектов!

Все,

Я пытаюсь воспроизвести проблему в этом Plunker:
http://plnkr.co/edit/q8DJJF?p=preview (попробуйте ввести идентификаторы пользователей 1, 2, 3 и т. д.)

Однако я больше не вижу ошибки. Я пробовал это с:

  • Угловой 1.3 + ng Таблица 0.3.0
  • Угловой 1.2 + ng Таблица 0.3.0
  • Угловой 1.3 + ng Таблица 0.5.0
  • Угловой 1.2 + ng Таблица 0.5.0

Решение @hasi работало некоторое время назад, но с тех пор я сменил работу и не могу вспомнить, как выглядел код до того, как я реализовал обходной путь.

Я старался держать Plunker как можно ближе к контроллеру @acoard (то есть на основе его нескольких его итераций).

Могу ли я получить помощь по воспроизведению проблемы в этом Plunker?

Всем привет,
Я только что столкнулся с этой проблемой в унаследованном мной проекте. Кто-то обновился до последней версии angular (1.4. *), И у нас были некоторые проблемы с ngTable, поэтому я обновил его до бета-версии 1.0.0 и увидел ошибку.

Кажется, что область видимости в ngTable «искажена». Я попробовал несколько исправлений, упомянутых выше, помимо

$scope.tableparams.settings().$scope = $scope

Что сработало для меня, так это настройка $scope для параметров таблицы при создании (я никогда раньше не использовал этот плагин, поэтому я не знаю внутреннюю работу плагина или то, как его следует правильно использовать)

Итак, наш код выглядит примерно так (это было взято из сообщения пользователя @acoard выше)


$scope.tableParams = new ngTableParams({
    page: 1,            
    count: 5,           // items per page
    sorting: {
        Date: 'desc' 
    }
}, {
    total: $scope.transactions.length, 
    getData: function($defer, params) {
        var data = $scope.transactions;
        var orderedData = params.sorting() ? $filter('orderBy')(data, params.orderBy()) : data;
        $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));

    },
    $scope: { $data: {} }
})

В нашем коде просто заменив
$scope: { $data: {} }

С
$scope: $scope
ИЛИ
$scope: $scope.new()

Исправлена ​​проблема.

Так что в моем случае линии больше похожи на

$scope.$data = {};
...
$scope.tableParams = new ngTableParams({
    page: 1,            
    count: 5,           // items per page
    sorting: {
        Date: 'desc' 
    }
}, {
    total: $scope.transactions.length, 
    getData: function($defer, params) {
        var data = $scope.transactions;
        var orderedData = params.sorting() ? $filter('orderBy')(data, params.orderBy()) : data;
        $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));

    },
    $scope: $scope
})

Поэтому я добавил $data в локальную область видимости, поскольку я не думаю, что нам нужна изолированная область или дочерняя область, и все работает.

Надеюсь это поможет. Пожалуйста, дайте мне знать, если это категорически запрещено.

ваше здоровье
Kle

Одна простая модификация и все работает отлично -
var x = function(){}; if( (typeof newParams.reload) == (typeof x)) newParams.reload();
Как я проверил с помощью console.log (), если у вас несколько контроллеров, это вызывает некоторые проблемы, когда Ng-Table пытается перезагрузить объект до своего объекта NgTableParams. После этой модификации код работает без ошибок.

Большинство приведенных выше предложений либо обходят ошибку, либо не решают реальную проблему.

Я столкнулся с этой проблемой ровно в 3-й раз. Данные находятся в ответе, и ошибка помешала их привязке.

Чтобы воспроизвести эту проблему, просто создайте простой поиск и используйте ng-Table для отображения результатов. Я, конечно, вы столкнетесь с этой ошибкой после третьего поиска. Если вы этого не сделаете, поделитесь, пожалуйста, своим методом. Спасибо.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги