我有一个本地对象,我试图将其变成工厂,以便我的主控制器可以使用它:
//factory
app.factory('items', function($http) {
var items= {}; // define factory object
var items = $http.get('pathtojson/data.json').success(function(response) {
return response.data;
});
return items; // returning factory to make it ready to be pulled by the controller
});
控制器内部(Mainctrl):
<div class="container" ng-repeat="item in items.data" ...
然而,没有任何反应。我首先将json作为一个数组直接粘贴到工厂中进行了测试,所以我得到了:
app.factory("items", function () {
var items = {};
items.data = [{name: "value"}, {name: "value1"}etc. }];
return items;
});
以上工作正常。我使用this thread作为参考但无法使其工作。我做错了什么?
=====
var app = angular.module('app', []);
//factory
app.factory('itemsFactory', function($http) {
return {
getItems: function () {
return $http.get('pathtojson/data.json');
}
}
});
//controller
app.controller('MainCtrl', function($scope, itemsFactory){
itemsFactory.getItems().then(function(response){
$scope.items = response;
});
});
答案 0 :(得分:3)
代码中存在一些问题。我以github API为例,同样的东西也适用于你的例子(data.json数据)。
工厂服务代码应该是这样的。应该有一个对象,对于该对象,可以挂接属性/方法,并且需要返回相同的对象。在这个例子中,getItems()方法被挂钩。
app.factory('itemsFactory', function($http) {
var factory = {};
factory.getItems = function () {
return $http.get('https://api.github.com/users/angular/repos');
};
return factory;
});
这里有两种编写控制器的方法。一个是success()方法,另一个是then()方法。这两种方法的用法有所不同。 success()方法处理“data”,然后()方法处理“response”。当我们处理then()方法时,我们应该考虑“response.data”来获取实际数据。 “响应”对象具有其他信息以及“数据”。以下是两种使用方式。
// 1.success()方法。
app.controller('MainCtrl', function($scope, itemsFactory){
itemsFactory.getItems().success(function(data){ $scope.items = data; }); });
// 2.then()方法
app.controller('MainCtrl', function($scope, itemsFactory){ itemsFactory.getItems().then(function(response){ $scope.items = response.data; }); });
JSFiddle上的现场演示:http://jsfiddle.net/rajkarri/hejr5e8o/1/
答案 1 :(得分:1)
你需要注入&#34; itemsFactory&#34;进入你的控制器,并将你的工厂包装在一个函数中,所以它应该是这样的:
app.factory('itemsFactory', function($http) {
return {
getItems: function () {
return $http.get('pathtojson/data.json');
}
}
app.controller("Mainctrl", function(itemsFactory, $scope){
itemsFactory.getItems().then(function(response){
$scope.items = response;
});
});
答案 2 :(得分:0)
试试这个:
<div class="container" ng-repeat="item in items" ..