厂:
.factory("myFac", ['$http', '$q', function($http, $q) {
var defer = $q.defer();
$http.get('some/sample/url').then(function (response) { //success
/*
* Do something with response that needs to be complete before
* controller code is executed.
*/
defer.resolve('done');
}, function() { //error
defer.reject();
});
return defer.promise;
}]);
控制器:
.controller("testCtrl", ['$scope', 'myFac', function($scope, myFac) {
/*
* Factory code above is executed immediately as 'myFac' is loaded into controller.
* I do not want this.
*/
if($scope.someArbitraryBool === true) {
//THIS is when I want to execute code within myFac
myFac.then(function () {
//Execute code that is dependent on myFac resolving
});
}
}]);
如果可以在我需要之前延迟出厂代码,请告诉我。此外,如果有更好的方法来执行此概念,请随意纠正。
答案 0 :(得分:0)
您的工厂直接在工厂函数内部$http.get
返回自定义$ q promise。因此,当您在控制器函数中注入工厂依赖项时,它会要求angular创建一个myFac
工厂函数的对象,而创建函数对象时它会执行您返回工厂的代码块,基本上返回promise。
你可以做的是,只是从工厂函数中返回一个对象{}
,它将具有方法名称及其定义,所以当你注入内部角度控制器时,它将返回服务对象,这将是各种方法,如{ {1}}方法。无论何时您想要调用工厂方法,您都可以getData
factoryName.methodName()
进行操作。
此外,您已在服务中创建了一个额外的承诺,这是首先不需要的,因为您可以利用myFac.getData()
的承诺(它返回一个承诺对象。)
<强>工厂强>
$http.get
<强>控制器强>
.factory("myFac", ['$http', function($http) {
var getData = return $http.get('some/sample/url').then(function (response) { //success
return 'done'; //return to resolve promise with data.
}, function(error) { //error
return 'error'; //return to reject promise with data.
});
return {
getData: getData
};
}]);