2014-10-30 1 views
1

저는 ionic/Angular n00b이고 이것을 수행하는 방법을 고민하는 데 어려움을 겪고 있습니다.각도 내에서 팩토리 방법으로 데이터를 반환하는 방법은 무엇입니까?

angular.module('starter.services', []) 

.factory('Calendars', function() { 

    var calendars; 
    var success = function(message) { 
     calendars = message; 
     return calendars; 
    }; 
    var error = function(message) {alert("Error: " + message)}; 

    window.plugins.calendar.listCalendars(success,error); 

    return { 
     all: function() { 
      return calendars; 
     }, 
     get: function(calendarId) { 
      return calendars[calendarId]; 
     } 
    } 


}); 

그리고 나는 이런 내 컨트롤러 내 캘린더 검색하기 위해 노력하고있어 :

나는 공장과 같은 정의가 공장 방법을

.controller('CalendarsCtrl', function($scope,Calendars) { 

    $scope.calendars = Calendars.all(); 

}) 

를 호출되고 있지만, 결과를 'success'콜백이 호출 될 때까지는 사용할 수 없으므로 CalendarsCtrl은 항상 정의되지 않습니다.

해결 방법?

편집 - 컨트롤러 내에서 통화를 수정했습니다. 그래도 함수는 성공 콜백 때까지 결과를 반환하지 않는다는 동일한 문제가 남아 있습니다.

+1

'성공'콜백 ​​외부에서'캘린더 '를 정의하지 않는다는 것을 알게되었습니다. 하지만 그렇게 한 후에도 컨트롤러에서 $ scope = Calendars.all()을 사용하여 캘린더를 검색해야합니다. – Blazemonger

답변

0

각도 팩토리가 객체를 반환하면 메소드를 호출하기 위해 내부 함수를 호출하는 Calendar.all()을 호출해야합니다.

2

약속을해야합니다.

먼저 지금이 더 이상 정의되지 않은 데이터가 해결 된 후 반환을 (만들 것이

all: function() { 
    var deferred = $q.defer(); 

    window.plugins.calendar.listCalendars(function(data) { 
     deferred.resolve(data); 
    } 
    ,function(error) { 
     deferred.reject(error); // something went wrong here 
    }); 
    return deferred.promise; 

을) 종속성 $ q를 모두 다음

.factory('Calendars', function ($q) { 

를 (추가). 당신이 당신의 컨트롤러에서 데이터를 다시 얻을 때

마지막으로 한가지, 지금 당신은 당신이 여기에 약속에 대해 좀 더 읽을 수있는이

var promise = Calendars.all(); 
promise.then(function(data) { 
    console.log('Success: you can use your calendar data now'); 
}, function(error) { 
    console.log('Failed for some reason:' + error); 
}); 

을 수행 https://docs.angularjs.org/api/ng/service/ $의 Q를

나는 이해하기 어렵다 알고 처음.

관련 문제