アプリに状態を動的に追加しようとしていますが、ui-routerを使用してみました。このスレッドをフォローしてみました。 AngularJS-UI-router-動的ビューの構成方法
私の場合、すでにいくつかの既存の状態があり、動的状態をjsonから読み取ってそのリストに追加する必要があります
何らかの理由で、deferIntercept()メソッドに使用しようとすると、$ urlRouterProviderでインジェクターエラーが発生します。私の場合、angular 1.3で、ui-routerのバージョンは0.2.10です。同期的に状態を作成できるようですが、すでに構成されている状態の既存のリストに追加できますか?静的に
これが私のコードです。助けていただければ幸いです。
MY modules.json、
[{
"name": "applications1",
"url": "^/templates/applications1",
"parent": "authenticated",
"abstract": false,
"views": [{
"name": "",
"templateUrl": "html/templates/basicLayout.html"
}, {
"name": "header@applications1",
"templateUrl": "html/templates/header.html"
}],
{
"name": "login",
"url": "/login",
"abstract": false,
"views": [{
"name": "",
"templateUrl": "html/admin/loginForm.html"
}]
}]
私のapp.js
var $stateProviderRef = null;
var $urlRouterProviderRef = null;
var aModule = angular.module('App', [
'ui.bootstrap','ui.router'
]);
adminModule.run(['$rootScope', '$state', '$stateParams',
function ($rootScope, $state, $stateParams) {
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
}])
adminModule.run(['$q', '$rootScope','$http', '$urlRouter',
function ($q, $rootScope, $http, $urlRouter)
{
$http
.get("modules.json")
.success(function(data)
{
angular.forEach(data, function (value, key)
{
var state = {
"url": value.url,
"parent" : value.parent,
"abstract": value.abstract,
"views": {}
};
angular.forEach(value.views, function (view)
{
state.views[view.name] = {
templateUrl : view.templateUrl,
};
});
$stateProviderRef.state(value.name, state);
});
// Configures $urlRouter's listener *after* your custom listener
$urlRouter.sync();
$urlRouter.listen();
});
}]);
aModule.config(['$locationProvider', '$stateProvider', '$urlRouterProvider', '$httpProvider', function ($locationProvider, $stateProvider, $urlRouterProvider, $httpProvider) {
// XSRF token naming
$httpProvider.defaults.xsrfHeaderName = 'x-dt-csrf-header';
$httpProvider.defaults.xsrfCookieName = 'X-CSRF-TOKEN';
$httpProvider.interceptors.Push('httpInterceptor');
$stateProvider
.state('login', {
url: '/login',
templateUrl: 'html/XXX/loginForm.html',
controller: 'AController'
})
.state('sAgree', {
url: '/serviceAgreement',
templateUrl: 'html/xxx/s.html',
controller: 'SController'
});
$urlRouterProvider.deferIntercept();
$urlRouterProvider.otherwise('/login');
$locationProvider.html5Mode({enabled: false});
$stateProviderRef = $stateProvider;
$urlRouterProviderRef = $urlRouterProvider;
}]);
動作中のプランカー があり、上記のすべてのスニペットが含まれています。
まだ存在していないいくつかの状態を追加したい場合は、$state.get('stateName')
を確認する必要があります。
$http
.get("modules.json")
.success(function(data) {
angular.forEach(data, function(value, key) {
// here we ask if there is a state with the same name
var getExistingState = $state.get(value.name)
// no need to continue, there is state (e.g. login) already
if(getExistingState !== null){
return;
}
var state = {
"url": value.url,
"parent": value.parent,
"abstract": value.abstract,
"views": {}
};
angular.forEach(value.views, function(view) {
state.views[view.name] = {
templateUrl: view.templateUrl,
};
});
$stateProviderRef.state(value.name, state);
});
// Configures $urlRouter's listener *after* your custom listener
$urlRouter.sync();
$urlRouter.listen();
});
次のことを確認してください ここで動作中