Создать контроллер с сервисом - Get ... не является функцией - PullRequest
0 голосов
/ 05 июня 2018

В проекте ASP.NET Boilerplate у меня есть следующий код:

(function () {
    appModule.controller('augustinum.views.kostenstelle.index', [
        '$scope', '$uibModal', 'abp.services.app.kostenstelle',
        function ($scope, kostenstelleService) {
            var vm = this;

            vm.kostenstellen = [];

            vm.getKostenstelle = function () {
                kostenstelleService.getKostenstelle().then(function (result) {
                    vm.kostenstellen = result.items;
                    console.log("Step1" + vm.kostenstellen.length);
                });
            };

            vm.getKostenstelle();   
            console.log("Step2" + vm.kostenstellen.length);
        }
    ]);
})();

У меня есть два вопроса:

  1. Я получаю ошибку:

    getKostenstelle () не является функцией.

    Если я заменю kostenstelleService.getKostenstelle() на abp.services.app.kostenstelle.getKostenstelle(), код работает - возвращается список объектов Kostenstelle.Но я думаю, что я потерял область действия с этим обходным путем, так что не так с kostenstelleService?

  2. Если код работает (заменяя kostnestelleService), я получаю 2элементы в массиве kostenstelle[].В строке с "Step1" получаю правильное количество - 2 элементов.Но в строке с "Step2" я получаю 0 элементов.Зачем?И как я могу изменить код, чтобы строка с "Step2" выполнялась при заполнении массива?

Большое спасибо заранее.

1 Ответ

0 голосов
/ 05 июня 2018

1) Это потому, что вы забыли включить $uibModal здесь function ($scope, kostenstelleService) { (строка 4).Поэтому kostenstelleService указывает на $uibModal сейчас.

Должно быть:

appModule.controller('augustinum.views.kostenstelle.index', 
    ['$scope', '$uibModal', 'abp.services.app.kostenstelle',
    function ($scope, $uibModal, kostenstelleService) {

2) Это потому, что getKostenstelle() - это асинхронная операция, заключенная в обещание.JavaScript является однопоточным, что означает, что он выполняет каждую операцию одну за другой и помещает асинхронные операции в очередь ожидания, чтобы не блокировать поток.

В вашем случае происходит следующее:

  1. Выполнить vm.getKostenstelle()
    • Выполнить kostenstelleService.getKostenstelle() и поместить в очередь ожидания
  2. Выполнить console.log("Step2" + vm.kostenstellen.length);
    • На данный момент vm.kostenstellen.length пусто, поскольку асинхронный вызов не завершен
  3. Асинхронный вызов kostenstelleService.getKostenstelle() Завершено
    • .then блок выполнен;vm.kostenstellen назначены данные, а console.log("Step1" + vm.kostenstellen.length); отображает данные
...