【问题标题】:Angularjs Factoryname.function is not a functionAngularjs Factoryname.function 不是函数
【发布时间】:2016-09-02 08:47:39
【问题描述】:

我正在尝试从控制器调用工厂函数。

我的代码:

angular.module("mainApp", ['ui.router', 'ngAnimate', 'toaster'])

.factory("authenticationSvc", function($http, $q, $window) {
    var userInfo;

    function login(userName, password) {
        var deferred = $q.defer();

        $http.post("/api/login", {
            userName: userName,
            password: password
        }).then(function(result) {
            userInfo = {
                accessToken: result.data.access_token,
                userName: result.data.userName
            };
            $window.sessionStorage["userInfo"] = JSON.stringify(userInfo);
            deferred.resolve(userInfo);
        }, function(error) {
            deferred.reject(error);
        });

        return deferred.promise;
    }

    return {
        login: login
    };
})
.controller("LoginController", function($scope, toaster, $rootScope, $stateParams, $location, $http, authenticationSvc) {
    $scope.login = authenticationSvc.login();
});

但我收到一个错误

TypeError: authenticationSvc.login 不是函数

【问题讨论】:

  • 你设置断点到 $scope.login = ...? das authenticationSvc 有什么价值?

标签: angularjs controller factory


【解决方案1】:

函数登录需要两个参数

所以没有定义没有参数的函数登录

【讨论】:

    【解决方案2】:

    首先,工厂的方法和形式化没有做好。

    尝试使用以下方法..

    .factory("authenticationSvc", function($http, $q, $window) {
    var userInfo;
    
    var authenticationSvc={};
    
    //Define login()
    authenticationSvc.login=function(userName, password) {
        var deferred = $q.defer();
    
        $http.post("/api/login", {
            userName: userName,
            password: password
        }).then(function(result) {
            userInfo = {
                accessToken: result.data.access_token,
                userName: result.data.userName
            };
            $window.sessionStorage["userInfo"] = JSON.stringify(userInfo);
            deferred.resolve(userInfo);
        }, function(error) {
            deferred.reject(error);
        });
    
        return deferred.promise;
    }
    
    //return Factory Object
    return authenticationSvc;
    
    })
    

    在控制器中,尝试以相同的方法调用

    .controller("LoginController", function($scope, toaster, $rootScope, $stateParams, $location, $http, authenticationSvc) {
    $scope.login = authenticationSvc.login();
    

    });

    希望这会有所帮助。 干杯

    【讨论】:

      【解决方案3】:

      下面是工厂行为的基本示例。请使用以下代码更改您的代码

      angular.module("mainApp", ['ui.router', 'ngAnimate', 'toaster'])
      
      .factory("authenticationSvc", function($http, $q, $window) {
          var userInfo, authentication = {};
      
          authentication.login = function(userName, password) {
      
              var deferred = $q.defer();
      
              $http.post("/api/login", {
                  userName: userName,
                  password: password
              }).then(function(result) {
                  userInfo = {
                      accessToken: result.data.access_token,
                      userName: result.data.userName
                  };
                  $window.sessionStorage["userInfo"] = JSON.stringify(userInfo);
                  deferred.resolve(userInfo);
              }, function(error) {
                  deferred.reject(error);
              });
      
              return deferred.promise;
          }
      
          return authentication;
      })
      .controller("LoginController", function($scope, toaster, $rootScope, $stateParams, $location, $http, authenticationSvc) {
          $scope.login = authenticationSvc.login(user,password);
      });
      

      尽管我没有测试过,但请检查一下。在你的工厂里面:

      您只需创建一个对象,为其添加属性,然后返回相同的 目的。当您将此服务传递给您的控制器时,那些 对象上的属性现在将在该控制器中可用 通过你的工厂。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-24
        • 2017-06-25
        • 2014-06-13
        • 2018-09-05
        相关资源
        最近更新 更多