【问题标题】:Create controller with service — Get... is not a function使用服务创建控制器 — Get... 不是函数
【发布时间】:2018-11-14 14:40:19
【问题描述】:

在一个 ASP.NET 样板项目中,我有以下代码:

(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),我会在数组kostenstelle[] 中得到2 元素。在"Step1" 的行中,我得到了正确的数字——2 元素。但与"Step2" 一致,我得到0 元素。为什么?还有怎么改代码,让"Step2"的行在数组填满的时候执行?

非常感谢。

【问题讨论】:

    标签: javascript asp.net angularjs angularjs-scope asp.net-boilerplate


    【解决方案1】:

    1) 那是因为您忘记在此处的function ($scope, kostenstelleService) { 中包含$uibModal(第4 行)。因此kostenstelleService 现在指向$uibModal

    应该是:

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

    2) 那是因为getKostenstelle() 是一个封装在 Promise 中的异步操作。 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); 显示数据

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-01
      • 2014-01-04
      • 1970-01-01
      相关资源
      最近更新 更多