У меня возникла проблема с отображением информации о продукте из базы данных с использованием фабрики AngularJS . В основном это приложение корзины покупок, которое я модифицировал для отображения продуктов из базы данных, а не жестко закодированного массива.Как получить данные с помощью фабрики AngularJS?
Heres файл главного приложения исходный код (app.js):
'use strict';
var shop = angular.module('shop', []);
// create a data service that provides a store and a shopping cart that
// will be shared by all views (instead of creating fresh ones for each view)
shop.factory("DataService",['$http', function($http) {
// create store
var myStore = new store($http);
// return data object with store and cart
return {
store: myStore
//cart: myCart ignore for now
}
}]);
// adding the config on the module
shop.config(function($routeProvider) {
$routeProvider // angular object, injected dynamically
.when('/', // we show the store on the root
{
controller: 'StoreController',
templateUrl: 'partials/store.htm'
})
.when('/cart',
{
controller: 'CartController',
templateUrl: 'partials/cart.htm'
})
.when('/checkout',
{
controller: 'CheckoutController',
templateUrl: 'partials/checkout.htm'
})
.when('/invoice',
{
controller: 'InvoiceController',
templateUrl: 'partials/invoice.htm'
})
.otherwise({ redirectTo: '/' }); // store
});
var controllers = {};
controllers.StoreController = function($scope, $routeParams, DataService) {
$scope.store = DataService.store;
console.log($scope.store);
//$scope.cart = DataService.cart;
}
Исходный код магазина (store.js), где я извлечения данных:
function store($http) {
this.products = [];
this.url = 'php/db.php';
this.fields = [
'product_id',
'product_name',
'product_description',
'product_price'
];
this.products = this.getProducts($http);
}
store.prototype.getProducts = function($http) {
$http.post(this.url, { "action" : 'products', "fields" : this.fields })
.success(function(data, status) {
//$scope.result = data; // Show result from server in our <pre></pre> element
//return data;
this.products = data;
})
.error(function(data, status) {
//return data || "Request failed";
//this.status = status;
this.products = [];
});
}
store.prototype.getProduct = function (sku) {
for (var i = 0; i < this.products.length; i++) {
if (this.products[i].sku == sku)
return this.products[i];
}
return null;
}
Может кто-нибудь сказать мне, что я делаю неправильно здесь?
- Почему я не могу установить переменную this.product в результат базы данных?
- Я также хотел бы расширить класс продуктов с большим количеством функций для сохранения элементов в базу данных, как бы я мог это сделать?
Любой совет, который очень ценится.
Привет
ОБНОВЛЕНИЕ
Я добавил код app.js ниже, я имею вопрос с контроллером (StoreController), когда доступ к данным из класса магазина (store.js) , Он по-прежнему показывает пустой массив. Я изменил свой код, как предложил m.e.conroy.
app.js
'use strict';
var shop = angular.module('shop', []);
shop.factory("DataService",['$http', '$q', function($http, $q) {
// create store
var myStore = new store($http, $q);
return {
store: myStore
}
}]);
// adding the config on the module
shop.config(function($routeProvider) {
$routeProvider // angular object, injected dynamically
.when('/', // we show the store on the root
{
controller: 'StoreController',
templateUrl: 'partials/store.htm'
})
.when('/cart',
{
controller: 'CartController',
templateUrl: 'partials/cart.htm'
})
.when('/checkout',
{
controller: 'CheckoutController',
templateUrl: 'partials/checkout.htm'
})
.when('/invoice',
{
controller: 'InvoiceController',
templateUrl: 'partials/invoice.htm'
})
.otherwise({ redirectTo: '/' }); // store
});
var controllers = {};
controllers.StoreController = function($scope, $http, $routeParams, DataService) {
$scope.store = DataService.store;
}
shop.controller(controllers);
DataService.store вернуть обещание, так что вам нужно решить, чтобы поймать Значение. И кажется, что вы храните функцию, не возвращает объект результата ... вам нужно вернуть этот объект. Можете ли вы создать пример plunker с полной реализацией фабричной фабрики? –
Посмотрите этот хороший пример приложения angularjs https://github.com/andreev-artem/angular_experiments/tree/master/examples/architecture и здесь http://jsfiddle.net/u5gV2/ для простого кеша памяти. –
Возвращаемые данные не определены. в коде я устанавливаю переменную this.products в значение, которое возвращается в обработчике успеха. – QCar