我有一个angularjs应用程序变得越来越复杂,所以我需要将事物分解为多个控制器。我需要创建一个工厂来使用http.get获取我的数据,并在几个控制器之间共享该数据。我有一个简单的版本将数据传递到控制器,但我不确定使用http.get的工厂。另外,我想确保http.get只被调用一次,对于工作示例代码,请参阅this plunker
var myApp = angular.module('myApp', []);
myApp.factory('Data2', function($http){
var getDataUrlString = "myhappyurl.com";
return $http.get(getDataUrlString);
})
myApp.factory('Data', function(){
return {message:"cool data from factory"}
})
myApp.controller('firstController', function($scope, Data){
$scope.firstData = Data;
})
myApp.controller('secondController', function($scope, Data){
$scope.secondData = Data;
})
我认为我非常接近我想要使用的工厂' Data2'。刚返回字符串消息的数据工厂工作得很好,正如您在我提供的示例代码中看到的那样,我只需要帮助弥合从简单字符串到http.get的差距。
答案 0 :(得分:2)
您的工厂Data2会返回一个承诺,因此您需要在承诺解决/拒绝后访问响应: -
myApp.controller('firstController', function($scope, Data2){
Data2.then(function(response){
$scope.firstData = response.data;
}).catch(function(error){
//handle error
});
});
请注意,由于您将promise作为工厂实例返回,而工厂是单例,因此每次都不会实例化,这意味着您将始终获得相同的承诺,并且不会一次又一次地调用url。您可能希望将其包装在函数中,并使用带有函数引用的键从工厂返回一个对象。