Я имею дело с одностраничным приложением AngularJS (v1.6) + Restangular (v1.6.1), и я изо всех сил пытаюсь заставить работать 2 различных сервиса Restrict, как я ожидаю.
Идея состоит в том, чтобы получить список ProductTypes из серверной части, а затем список продуктов для каждого типа, с которым конечному пользователю разрешено взаимодействовать;
помните, что API-интерфейсы ProductTypes и Products используют разные базовые URL-адреса.
Проблема:
трансформаторы элементов продукции никогда не называются: что я делаю не так?
Я попробовал следующий подход:
// index.js file
// here I require everything the web-app needs...
angular.
module('ProductReader', ['ui.router', 'restangular'])
.config(ProductTypesConfig)
.config(Routing)
.service('ProductsRestangular', ProductsRestangular)
.constant('PRODUCT_TYPES_CONST', PRODUCT_TYPES_CONST)
.constant('PRODUCTS_CONST', PRODUCTS_CONST);
// PRODUCT_TYPES_CONST file
PRODUCT_TYPES_CONST = {
API_URL: 'product_types_api',
ENDPOINT: 'product_types'
};
module.exports = PRODUCT_TYPES_CONST;
// PRODUCTS_CONST file
PRODUCTS_CONST = {
API_URL: 'products_api',
TYPES: {}
/**
* here the structure built via the config below should be looking like the following
* TYPES: {
PRODUCT_TYPE_1: {
ENDPOINT: 'product_type_1'
},
PRODUCT_TYPE_2: {
ENDPOINT: 'product_type_2'
}
}
*/
}
module.exports = PRODUCTS_CONST;
// ProductTypesConfig file
/** @ngInject */
function ProductTypesConfig(RestangularProvider, PRODUCT_TYPES_CONST, PRODUCTS_CONST) {
RestangularProvider.setBaseUrl(PRODUCT_TYPES_CONST.API_URL);
//ProductTypes
RestangularProvider
.addElementTransformer(PRODUCT_TYPES_CONST.ENDPOINT, false, function(productType) {
PRODUCTS_CONST.TYPES[productType.name.toUpperCase()] = {
ENDPOINT: productType.endpoint
}
//Products
RestangularProvider
.addElementTransformer(productType.endpoint, false, function(singleProduct) {
let frontEndSingleProductStuff = {};
// ... here stuff is added to the object above...
return angular.extend(rw9Item, {
frontEnd: frontEndSingleProductStuff
});
});
return productType;
});
}
module.exports = ProductTypesConfig;
// Products Custom Factory
/** @ngInject */
function ProductsRestangular(Restangular, PRODUCTS_CONST) {
return Restangular.withConfig(function(RestangularConfigurer) {
RestangularConfigurer.setBaseUrl(PRODUCTS_CONST.API_URL);
});
}
module.exports = ProductsRestangular;
// Routing file
/** @ngInject */
function Routing($stateProvider, PRODUCT_TYPES_CONST) {
$stateProvider
.state('landing', {
abstract: true,
url: '/product-reader',
resolve: {
productTypes: function(Restangular, PRODUCT_TYPES_CONST) {
return Restangular.all(PRODUCT_TYPES_CONST.ENDPOINT).getList();
},
}
})
.state('product-list', {
parent: 'landing',
url: '/list/{:productType}',
resolve: {
productLists: function($transition$, ProductsRestangular, PRODUCTS_CONST) {
return ProductsRestangular.all(PRODUCTS_CONST[$transition$.params().productType].ENDPOINT).getList();
}
}
});
}