我的目标是能够从两个控制器交换数据,我已经被告知我可以创建一个服务,然后将数据注入其他控制器 - 但是我无法将此('somethingDetailCtrl')控制器转换为服务/工厂..
somethingApp.controller('somethingDetailCtrl', ['$scope', '$routeParams', '$http',
function($scope, $routeParams, $http) {
$http.get('/assets/javascripts/something/something/' + $routeParams._id +'.json').success(function(data) {
$scope.thething = data;
});
}]);
有人会非常友好地指导我完成这项工作(只是将someDetailCtrl转换为工厂),我有大约2天的角度知识,所以任何解释都是受欢迎的。
答案 0 :(得分:1)
angularjs工厂使用一个函数构造一个新服务,该函数返回一个具有服务公开的所有数据和行为的对象。工厂是单身人士。您的示例控制器正在寻找公开http GET,如果我们不关心错误检查,可以像这样编写:
angular.module('something',[]).factory('Something', function($http) {
return {
getSomething: function(callback) {
$http.get('/something').success(function(data, status) {
callback(data, status);
})
}
}
}
工厂函数的参数是它的依赖项。在上面的例子中,我们只使用$ http。我们可以通过添加$ q来使用promises ...再次我们在此示例中跳过错误检查:
angular.module('something',[]).factory('Something', function($http, $q) {
return {
getSomething: function() {
var deferred = $q.defer();
$http.get('/something').success(function(data, status) {
deferred.resolve(data);
});
return deferred.promise;
}
}
}
您可以从控制器中使用上述任何一种方法。要使用第一个工厂示例,您可以执行以下操作,其中控制器函数的第二个参数是工厂生成的服务:
angular.module('somethingApp').controller('somethingDetailCtrl', function ($scope, Something) {
Something.getSomething(function(data) {
$scope.thething = data;
});
}
希望这有帮助。
答案 1 :(得分:0)
据我所知,这家工厂写得很好。现在你只需要将它注入你的控制器。例如,要扩展上面的控制器,您可以将其更改为:
somethingApp.controller('somethingDetailCtrl', ['$scope', '$routeParams', 'somethingListFactory',
function($scope, $routeParams, somethingListFactory) {
somethingListFactory.list().then(function(data){
$scope.thething = data;
});
});
}]);
编辑:我立即纠正,从工厂中删除以下部分(这是徒劳的):
.then(
function(result) {
return result.data;
});