0

Я новичок в Angular, и я некоторое время пытаюсь назвать фабрику, которая использует Restangular в одном из моих контроллеров. Вот контроллер:AngularJS: Сервисный объект пустой

'use strict'; 
angular.module('myApp') 
    .controller('UserCtrl', ['WebApi', function($scope, WebApi) { 
    $scope.user = WebApi.getProfile(1); 
    } 
]); 

Всякий раз, когда я вызываю фабрику WebApi в своем контроллере, объект WebApi пуст. Когда я вызову метод, он будет возвращен не определен. При входе в объект в консоли, я получаю

Object {} 

Вот моя фабрика:

"use strict"; 
angular.module("myApp.services", ["restangular"]) 
    .factory("WebApi", ["Restangular", function(Restangular) { 
    var getProfile; 
    Restangular.withConfig(function(RestangularConfigurer) { 
     RestangularConfigurer.setBaseUrl("http://127.0.0.1:3000/api/v1"); 
    }); 
    getProfile = function(id) { 
     Restangular.one("users", id).get().then(function(data) { 
     return data; 
     }); 
    }; 
    } 
]); 

App модуль:

'use strict'; 
angular.module('myApp', ['ngCookies', 'ngSanitize', 'ui.router', 'myApp.services']); 

И это включено в мой указательный HTML:

<script src="scripts/app.js"></script> 
    <script src="scripts/controllers/main.js"></script> 
    <script src="scripts/services/webapi.js"></script> 
    <script src="scripts/controllers/user.js"></script> 

Что я делаю неправильно? Заранее спасибо.

ответ

2

Это один является асинхронным вызов:

Restangular.one("users", id).get().then(function(data) { 
    return data; 
    }); 

и ничего не возвращается в его родительская функция.

Вы можете вернуть обещание от родительской функции и разрешить ее внутри обратного вызова then, упомянутого выше (вместо return data;).

Другое дело, что фабрике необходимо вернуть объект, чтобы его свойства были доступны. Есть некоторые действительно хорошие ответы здесь: angular.service vs angular.factory


UPDATE

Основываясь на вопрос в комментариях, вот что я имею в виду того, чтобы вернуть объект:

angular.module("myApp.services", ["restangular"]) 
    .factory("WebApi", ["Restangular", function(Restangular) { 
    var getProfile; 
    getProfile = function(id) { 
     // this function is not visible from outside 
    }; 
    // but if you do this: 
    return { 
     someValue: 3, // accessible via WebApi.someValue 
     someFunction: function(){alert('me too')}, 
     getProfile: getProfile // now it works as WebApi.getProfile(), 
     etc: etc 
    } 
    // all of these above are now accessible 
    } 
]); 

ВИДЕТЬ простой пример здесь: http://plnkr.co/edit/KGUqCVJqeEcD5d6m7sVw?p=preview

+0

Я понимаю разницу между сервисом и фабрикой, но даже если я просто сделаю простую функцию или атрибут для 'WebApi' и вызову его с контроллера, объект' WebApi' пуст. Почему это? – user3181113

+0

Поскольку его нужно вернуть, позвольте мне показать вам простой пример, чтобы понять, что я имею в виду. – Shomz

+1

Ahhh, я понимаю сейчас. Спасибо. – user3181113

0

Вы должны изменить код, чтобы использовать обещание и вернуть обещание оттуда увидеть манекен кода

 angular.module("myApp.services", ["restangular"]) 
       .factory("WebApi", ["Restangular","$q", function(Restangular,$q) { 

       Restangular.withConfig(function(RestangularConfigurer) { 
        RestangularConfigurer.setBaseUrl("http://127.0.0.1:3000/api/v1"); 
       }); 
       return { 
       getProfile : function(id) { 
       var deferred = $q.defer(); 
        Restangular.one("users", id).get().then(function(data) { 
        deferred.resolve(data); 
        }); 
        return deferred.promise; 
       }; 
} 

       } 
      ]); 

     'use strict'; 
     angular.module('myApp') 
      .controller('UserCtrl', ['WebApi', function($scope, WebApi) { 
      WebApi.getProfile(1).then(function(data){$scope.user=data}); 
      } 
     ]); 
+0

Консоль взрывается с ошибками и состояниями 'TypeError: undefined не является функцией' и указывает на функцию' WebApi.getProfile() 'в 'UserCtrl'. Я зарегистрировал объект 'WebApi' в консоли и все еще говорит' Object {} ' – user3181113

+0

Нам не хватает возврата с завода, поэтому я отредактировал с возвратом, вы можете попробовать сейчас –

+0

Мой код идентичен вашему, и все же я получаю 'TypeError: undefined не является функцией', потому что объект пуст. Это так странно, потому что контроллер знает фабрику и не может с ней общаться. Я даже поставил простую функцию, которая возвращает '' строку ''и она все еще не появляется в объекте' WebApi'. У вас есть идеи, почему это так? Это как-то в моих зависимостях? – user3181113

Смежные вопросы