У меня есть локальный объект, который я пытаюсь превратить в фабрику, поэтому он может использоваться моим основным контроллером:
//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;
});
Вышеизложенное отлично. Я использую этот поток как ссылку, но не могу заставить его работать. Что я делаю не так?
================
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;
});
});
В коде есть несколько проблем. Я использовал github API в качестве примера, и то же самое будет работать с вашим примером (data.json data).
Код сервисного обслуживания должен быть таким. Должен быть объект, и для этого свойства/методы объекта могут быть подключены и один и тот же объект должен быть возвращен. Здесь в этом примере метод 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() имеет дело с "данными", а затем() метод имеет дело с "ответом". Когда мы имеем дело с методом 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; }); });
Демо-версия Live на JSFiddle: http://jsfiddle.net/rajkarri/hejr5e8o/1/
вам нужно ввести "itemsFactory" в ваш контроллер, а также обернуть фабрику в функцию, чтобы она выглядела примерно так:
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;
});
});
Попробуй это:
<div class="container" ng-repeat="item in items" ..
factory
, а во втором возвращаетеitems
. Какitems
относятся кfactory
в вашем первом примере кода?