Можно ли передать параметр из состояния в состояние с угловыми?
Я хочу передать параметр из одного состояния хранилища в информацию о продукте на дисплее в состоянии продукта:
Мое приложение - storeApp
.config(['$stateProvider', function($stateProvider) {
$stateProvider
.state('store', {
url: '/store',
templateUrl: 'store/store',
controller: 'storeCtrl'
})
.state('products', {
url: '/products/:productSku',
templateUrl: 'store/product',
controller: 'productCtrl',
resolve: {
productResource: 'productFactory',
_product: function(productResource, $stateParams){
return productResource.getProduct($stateParams.productSku);
}
}
Store.jade
a(href='/products/{{product.sku}}')
Контроллер продукта
.controller("productCtrl", function ($rootScope, $http, $stateParams, productFactory, storeFactory) {
//.controller('productCtrl', ['_product', function ($scope, $rootScope, storeFactory, _product) {
console.log($stateParams.productSku);
Продукт Factory
function getProduct(sku) {
return $http.get('http://localhost:3000/api/products/' + sku );
}
Поскольку я использую MEAN Stack, node имеет маршрутизатор, прикрепленный для выражения:
Server.js
const storeController = require('./controllers/store');
server.get('/store/product', passportConfig.isAuthenticated, storeController.getProductPage);
Store.js
exports.getProductPage = (req, res) => {
res.render('store/product', {
title: 'PP',
angularApp: 'storeApp'
})
}
Я попробовал вернуться _product
, но я получаю Unknown provider: _productProvider <- _product <- productCtrl
Я попытался использовать ui-sref
- a(ui-sref="products({productSku:'{{product.sku}}'})")
в store.jade
для отправки параметра из store_State
в products_State
и, наконец, получил объект обратно из API.
Теперь проблема в том, что node не вернет представление.
В основном я пытаюсь достичь:
Node просмотр клиентских представлений, все виды хранилища - хранилище/товар/корзина прикреплены к angular app
через Server.js
, при нажатии на продукт магазина перенаправление на страницу продукта после resolve
информации о продукте из api
.
Я получаю информацию о продукте, но не получаю вид продукта.
Я посмотрел его, но все решения не сработали... может быть, мое плохое:-(
Как я могу это сделать?
UPDATE-1: это то, что происходит:
![Приложение загружает продукт, но не переходит в режим просмотра]()
ОБНОВЛЕНИЕ-2:
Когда я передаю элемент управления angular
, у меня есть express
маршрутизация меню, а angular stateProvider
маршрутизация/соединение views
- controllers
.
Основной вид, что загружает сам store
:
app.js - сохранить маршрут
$stateProvider
.state('store', {
url: '/store',
templateUrl: 'store/store',
controller: 'storeCtrl'
})
server.js(express)
server.get('/store', passportConfig.isAuthenticated, storeController.getStorePage);
store.js
exports.getStorePage = (req, res) => {
res.render('store/store', {
title: 'S--tore',
angularApp: 'storeApp'
});
}
store.ctr.js
angular.module("storeApp")
.controller("storeCtrl", function($rootScope, $http, storeFactory) {
var products;
storeFactory.getProducts().then(function(_products) {
products = _products.data;
$rootScope.products = products;
});
Это просто отлично!
Но когда я пытаюсь отправить представление param productSku
из store
в представление product
и попробуйте resolve
передать параметры продукта обратно в product
, что там, где он перестает работать, либо я получаю view ИЛИ я получаю params.
![моментальный снимок журнала консоли WebStorm]()
Я пробовал разные способы resolve
, все они приводят к тому же - просмотр OR параметров продукта.
app.js - маршрут продукта
.state('products', {
url: '/products/:productSku',
templateUrl: 'store/product',
controller: 'productCtrl',
resolve: {
_product: function ($stateParams, $state, $http) {
return $http.get('http://localhost:3000/api/products/' + $stateParams.productSku );
//return productResource.getProduct($stateParams.productSku)
}
}
})
Если я удалю resolve
и отправлю a(href='/products/{{product.sku}}')
из store.jade
, я получу шаблон в маршруте, ошибка chrome console
, которую я получаю: `Ошибка: $injector: unpr Unknown Provider _product < - productCtrl
product.ctr.js
.controller('productCtrl', ['_product', function ($rootScope, $http, $stateParams, productFactory, storeFactory, _product) {
Если я отправлю a(ui-sref="products({productSku: product.sku })")
с помощью resolve
, я получу параметры продукта (показано в снимке WebStorem выше) NO view.
Ответы
Ответ 1
angular не будет загружать нефритовые шаблоны, вам понадобится шаблон html, шаблон jade загружается экспресс. Вы можете попробовать использовать ui-view следующим образом:
Store.jade
div(ui-view)
a(href='/products/{{product.sku}}')
Что должно сделать angular искать неназванный вид при загрузке маршрута.
Ваш шаблонUrl не выглядит ориентированным на файлы, возможно, вам не хватает расширения файла?
Убедитесь, что вы возвращаете $promise
в разрешении, так как ui-router ждет, пока они не будут разрешены до визуализации представления.
Я бы рекомендовал иметь именованные представления с соответствующей конфигурацией в маршруте:
.state('store', {
url: '/store',
views: {
'@': {
templateUrl: 'store/store.html',
controller: 'storeCtrl'
}
}
})
.state('products', {
url: '/products/:productSku',
templateUrl: 'store/product',
controller: 'productCtrl',
resolve: {
_product: function ($stateParams, $state, $http) {
return $http.get('http://localhost:3000/api/products/' + $stateParams.productSku ).$promise;
}
}
})
Смотрите документы здесь: https://github.com/angular-ui/ui-router/wiki/Multiple-Named-Views
Ответ 2
Это решение, которое я нашел:
store.jade
a(href='/products/{{product.sku}}' ng-click='sku(product.sku)')
stroe.ctr.js
$rootScope.sku = function(value){
storeFactory.singleProduct.productSku = value;
storeFactory.singleProduct.saveSku();
}
store.fac.js
var singleProduct = {
productSku : '',
saveSku: function() {
sessionStorage.productSku = angular.toJson(singleProduct.productSku);
},
getSku: function() {
singleProduct.productSku = angular.fromJson(sessionStorage.productSku);
return singleProduct.productSku;
}
}
product.ctr.js
var sp = storeFactory.singleProduct.getSku();
productFactory.getProduct(sp).then(function (product) {
$rootScope.product = product.data;
});
product.fac.js
function getProduct(sku) {
return $http.get('http://localhost:3000/api/products/' + sku );
}
В основном я сохраняю productSku до sessionStorage
и получаю его оттуда, когда product.jade
просматривает нагрузки...
Thanx всем, кто пытался...
Ответ 3
Вы можете передать его как $state.data
в свой контроллер.
toState = $state.get("some-state");
toState.data.foo = $scope.foo;
$state.go(toState);
Ответ 4
Вы не включили зависимость _products
в storeCtrl
. Когда вы вызываете эту службу, вы получаете сообщение об ошибке.
Правильный код:
angular.module("storeApp")
.controller("storeCtrl", function($rootScope, $http, storeFactory, _products) {
var products;
storeFactory.getProducts().then(function(_products) {
products = _products.data;
$rootScope.products = products;
});
Вы можете использовать console.log("something here" + _products.data);
для просмотра в консоли своего браузера.