服务中的角函数不视为函数

迈克尔·马哈尼(Michael Mahony)

我一直试图将一堆代码移入服务中,而不是将其放置在控制器中,因为我的应用程序中的其他控制器将需要一些相同的功能。我有以下控制器代码:

JBenchApp.controller('CaseListCtrl', ['$scope', '$http', 'HoldState', 
  function ($scope, $http, HoldState) {

      //----------------------------------------------------------
      // Load the Calendar Data whent he department changes
      //----------------------------------------------------------

      $scope.getCalendarOnDeptChange = function () {
          // Get the dropdown into e
          var e = document.getElementById("deptSelect");

          // Set $scope.department to the text of the selected dropdown item --- MUST FIND BETTER ANGULAR METHOD
          $scope.department = e.options[e.selectedIndex].text;
          console.log($scope.department);
          $scope.getCalendar();
      };


      //----------------------------------------------------------
      // Load the calendar data
      //----------------------------------------------------------

      $scope.getCalendar = function () {
          // Retrieve calendar data
          HoldState.getCalendar($scope.lastDepartment, $scope.date, $scope.lastLawType, $scope.lastLocationID).then(function (data) {
              $scope.cases = data;
              $scope.$apply();
          });

          HoldState.setDepartment($scope.department);
      };

      //----------------------------------------------------------
      // Load the user's default settings
      //----------------------------------------------------------

      $scope.loadDefaults = function () {
          HoldState.getUserDefaults($scope.UserID).then(function (data) {
              $scope.UserDefaults = data;
          });

          $scope.defaultDepartment = $scope.UserDefaults.CourtRoom;
          $scope.defaultLawType = $scope.UserDefaults.LitigationCode;
          $scope.defaultLocationID = $scope.UserDefaults.LocID;
      };

      $scope.loadPaths = function () {
          HoldState.getTypeOfLaw().then(function (data) {
              $scope.lastLawType = data;
          });

          HoldState.getCourthouse().then(function (data) {
              $scope.lastLocationID = data;
          });

          HoldState.getDepartment().then(function (data) {
              $scope.lastDepartment = data;
          });
      };


      $scope.doAuthentication = function () {
          $scope.UserID = 'dpeng';
      };

      $scope.saveSequence = function () {

      };

      //----------------------------------------------------------
      // Initial processing
      //     Located here so that all functions are defined before 
      //     being called.
      // 1. Authenticate the user
      // 2. Get the default values
      // 3. Load the paths
      // 4. Get the list of departments
      // 5. Show the calendar.
      //----------------------------------------------------------
      $scope.doAuthentication();
      $scope.loadDefaults();
      $scope.loadPaths();

      HoldState.getDepartmentList($scope.lastLawType, $scope.lastLocationID).then(function (data) {
          $scope.departments = data;
      });

      $scope.getCalendar();

  }]);

我也有以下服务代码:

var StateService = angular.module('StateService', [])
.service('HoldState', function ($http) {
    this.setTypeOfLaw = function (a) { localStorage.setItem('LawType', a) };
    this.setCourthouse = function (a) { localStorage.setItem('Building', a) };
    this.setDepartment = function (a) { localStorage.setItem('Dept', a) };
    this.getTypeOfLaw = function () {
        var LT = localStorage.getItem('LawType');
        return LT;
    };
    this.getCourthouse = function () {
        var BLDG = localStorage.getItem('Building');
        return BLDG;
    };
    this.getDepartment = function () {
        var DEPT = localStorage.getItem('Dept');
        return DEPT;
    };

    this.setStatus = function (a) { localStorage.setItem('Status', a) };

    this.getStatus = function () {
        var STATUS = localStorage.getItem('Status');
        return STATUS;
    }

    //Begin default settings
    this.getUserDefaults = function (UserID) {
        var userDefaults = [];
        $http.get('http://10.34.34.46/BenchViewServices/api/UserPreference/Default/' + UserID)
            .then(function (response) {
                userDefaults = response;
                var status = this.getStatus();

                // If the status is 0 then we have not yet navigated anywhere so we will need to set the path values to be
                // the same as the default. We do nothing if status is not 0 because it means we already have path values set
                if (status == 0) {
                    this.setTypeOfLaw(response.LitigationCode);
                    this.setCourthouse(response.LocID);
                    this.setDepartment(response.CourtRoom);
                }

            }, function (response) {
                console.log(response.status + " -- " + response.data + " -- " + response.statusText);
            });


        return userDefaults;
    };

当我打电话时,$scope.loadDefaults();我看到一条错误消息:

TypeError: HoldState.getUserDefaults(...).then is not a function
    at m.$scope.loadDefaults (http://localhost:54365/js/controllers.js:78:52)
    at new <anonymous> (http://localhost:54365/js/controllers.js:121:14)
    at Object.e [as invoke] (http://localhost:54365/js/angular.min.js:36:315)
    at x.instance (http://localhost:54365/js/angular.min.js:76:79)
    at http://localhost:54365/js/angular.min.js:59:85
    at q (http://localhost:54365/js/angular.min.js:7:428)
    at M (http://localhost:54365/js/angular.min.js:59:69)
    at g (http://localhost:54365/js/angular.min.js:51:409)
    at http://localhost:54365/js/angular.min.js:51:17
    at chrome-extension://ighdmehidhipcmcojjgiloacoafjmpfk/dist/hint.js:2071:22 <div ng-view="" class="view-frame ng-scope">(anonymous function) @ angular.min.js:102
angular.min.js:102 TypeError: Cannot read property 'getStatus' of undefined
    at controllers.js:311
    at angular.min.js:112
    at m.$eval (angular.min.js:126)
    at m.$digest (angular.min.js:123)
    at m.scopePrototype.$digest (chrome-extension://ighdmehidhipcmcojjgiloacoafjmpfk/dist/hint.js:1955)
    at m.$apply (angular.min.js:127)
    at m.scopePrototype.$apply (chrome-extension://ighdmehidhipcmcojjgiloacoafjmpfk/dist/hint.js:2018)
    at l (angular.min.js:81)
    at P (angular.min.js:85)
    at XMLHttpRequest.H.onload (angular.min.js:86)(anonymous function) @ angular.min.js:102

我做错了什么?我只是试图通过Angular服务从Web服务中干净地取回数据。

尼尔·S

由于您正在对api进行异步调用,因此getUserDefaults是真正需要实现承诺的唯一方法。因此,将$ q注入您的服务,然后使该方法返回一个Promise。

this.getUserDefaults = function (UserID) {
    var userDefaults = [], deferred = $q.defer();
    $http.get('http://10.34.34.46/BenchViewServices/api/UserPreference/Default/' + UserID)
        .then(function (response) {

            var status = this.getStatus();

            // If the status is 0 then we have not yet navigated anywhere so we will need to set the path values to be
            // the same as the default. We do nothing if status is not 0 because it means we already have path values set
            if (status == 0) {
                this.setTypeOfLaw(response.LitigationCode);
                this.setCourthouse(response.LocID);
                this.setDepartment(response.CourtRoom);
            }
            d.resolve(response);
        }, function (response) {
            console.log(response.status + " -- " + response.data + " -- " + response.statusText);
        });


    return deferred.promise;
};

您还应该仅将吸气剂用作吸气剂,而不应将其视为应允。IE

$scope.loadPaths = function () {
      $scope.lastLawType = HoldState.getTypeOfLaw();

      $scope.lastLocationID = HoldState.getCourthouse();

      $scope.lastDepartment = HoldState.getDepartment();
  };

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章