AngularJs从控制器未定义

时间:2016-09-12 12:15:08

标签: javascript angularjs controller

我正在尝试从我的dataservice工厂调用一个函数,但它会抛出一个错误 无法读取未定义的属性“登录”

这是我的数据服务工厂

(function(){
  'use strict';
  // dataservice factory
 angular
.module('app')
.factory('dataservice', dataservice);

 dataservice.$inject = ['$http'];

 function dataservice($http) {

  return {
    login  : login
  }


function login(username, password, callback) {
    $http.post('/data', { username: username, password: password })
        .success(function (response) {
          console.log(response);
       });
    }  
 }
})();

这是我的控制器

(function(){

'use strict';

angular
  .module('app')
  .controller('TestController', TestController);

TestController.$inject = ['dataservice'];

function TestController(dataservice) { 

  var vm = this;

  vm.login = login;



function login() {
console.log('is this called?');
    vm.loading = true;
    dataservice.login(vm.username, vm.password, function (result) {
        console.log(result);
    });
 }

 }
})();

登录功能当我从视图中按下登录时会调用它,因为我得到: 在我的控制台中被称为

2 个答案:

答案 0 :(得分:3)

您需要在then

中修改回调
function login() {
    console.log('is this called?');
    vm.loading = true;
    dataservice.login(vm.username, vm.password).then(function (result) {
        console.log(result);
    }, function(error){
    });
 }

这是正确的语法。

您也可以使用此服务语法

   function login(){
        var d = $q.defer();
        $http({
            method: 'POST',
            url: '/data',
            data:{
                username : username,
                password : password
            }
        }).success(function(response){
            d.resolve(response);
        }).error(function(response){
            d.reject(response);
        });
        return d.promise;
    }

答案 1 :(得分:2)

我将您的示例更正为更常见和可读的语法。 Check this fiddle要看到它的实际效果。

the type of one of the expressions in the join clause is incorrect
  1. 您应该将第二个参数作为空数组传递给app.module(如果您对其他模块没有依赖关系)
  2. 使用$ http.then,因为.success已被删除。
  3. 将第二个参数传递给app.factory或app.controller作为一个数组,其中包含依赖项列表和函数。在您的示例中,您没有注入任何依赖项,因为TestController。$ inject = [' dataservice'];跑得太晚了。