2015-12-14 2 views
2

У меня проблема с моим сервисом в угловом режиме.Угловой сервис возврат не определено

Моя служба имеет следующий код:

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

Это происходит потому, что вы выполняете« возврат »для« function (Datos) {» не для« ObtenerMenu: function() {". Вы хорошо поняли эту известную проблему с обратным вызовом в своей функции Get. Я не могу предложить какое-либо решение, потому что я его не знаю, соглашусь на синхронный аякс, что неприемлемо. – Amit

+1

Есть ли из-за пространства после Ли.? "Ли. 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 заканчивается, эта функция уже завершена его стек выполнения