2015-12-14 360 views
2

我的角度服務存在問題。角度服務返回undefined

我的服務具有下面的代碼:

app.service("Utilidades", ['$http', '$window', function ($http, $window) { 
return { 
    Get: function (urlAbsoluta, parametros, callback) { 
     var Utilidades = this; 

     $http 
      .get(app.UrlBase + urlAbsoluta, parametros) 
      .then(function (data) { 
       var Datos = angular.fromJson(data); 

       Utilidades.GuardarToken(Datos.Token); 

       callback(Datos); 
      }); 
    }, 


    ObtenerMenu: function() { 
     var Utilidades = this; 

     Utilidades.Get("Administracion/Api/Usuarios/Menu", {}, function (Datos) { 
      Datos = angular.fromJson(Datos.data); 

      if (Datos.Error == "") { 
       return Datos.Resultado; 
      } else { 
       return ""; 
      } 
     }); 
    } 
} 
}]); 

然後,在我的控制器我有下面的代碼:

app.controller('LoginCtrl', ['$scope', '$http', '$location', 'Utilidades', 
function Iniciador($scope, $http, $location, Utilidades) { 
     var Li = this; 

     Li.Usuario = ""; 
     Li.Contrasena = ""; 
     Li.Error = ""; 
     Li.MenuItems = []; 

     Li.Menu = function() { 
      Li. MenuItems = Utilidades.ObtenerMenu(); 
     } 
    }] 
); 

當我運行此,Li.MenuItems具有未定義值,我不不知道爲什麼。

+0

你錯過了','後您的服務的'回報{ ...' – Aaron

+0

發生這種情況是因爲您正在做的「返回」是針對「函數(Datos){」 不適用於「ObtenerMenu:function(){」。 您在Get函數中回調了這個已知問題。我不能建議任何解決方案,我不知道一個,接受syncronic ajax這是不可接受的。 – Amit

+1

是因爲李後的空間。 「Li。MenuItems = Utilidades.ObtenerMenu();」 –

回答

5

return語句是一個函數裏面方法ObtenerMenu所以ObtenerMenu方法實際上並沒有返回任何東西。您需要提供一種方法來訪問結果值:

服務

app.service("Utilidades", ['$http', '$window', function ($http, $window) { 
    return { 
     Get: function (urlAbsoluta, parametros) { 
      var Utilidades = this; 

      // v------------ return statement here 
      return $http 
       .get(app.UrlBase + urlAbsoluta, parametros) 
       .then(function (data) { 
        var Datos = angular.fromJson(data); 

        Utilidades.GuardarToken(Datos.Token); 

        // v------------ return statement here 
        return Datos; 
       }); 
     }, 


     ObtenerMenu: function() { 
      var Utilidades = this; 

      // v------------ return statement here 
      return Utilidades.Get("Administracion/Api/Usuarios/Menu", {}) 
       .then(function (Datos) { 
        if (Datos.Error == "") { 
         return Datos.Resultado; 
        } else { 
         return ""; 
        } 
       }); 
     } 
    }; 
}]); 

在控制器

Li.Menu = function() { 
    Utilidades.ObtenerMenu() 
     .then(function (resultado) { 
      Li. MenuItems = resultado; 
     }); 
} 
0

這是因爲ObtenerMenu函數是異步函數。該功能最初沒有(那麼未定義),後來返回任何東西,一段時間後,當Ajax請求完成後,該功能已經完成了它的執行堆棧