我试图实现一个语言切换器,如果用户点击" de"来自" en"的任何给定页面方面 - 它将它们带到" de"的那一页。侧。如果我在console.dir中使用$ state参数,它会使用" current"来显示我想要的值。给定$ state的属性。如果我尝试使用console.dir $ state.current来关注我想要的值,它只会给出父状态属性(我当前的视图是嵌套的)。
我目前的想法是,我在url / en / content上,然后动态地我可以让我的lang导航动态地将适当的目标点加载到某种数据属性中,用自定义指令选择那些我发起了一个"去"并根据angular-translate设置我的preferedLanguage值。
目前的关键问题是公开$ state name - 再次,当简单地浏览$ state时,当前对象给出我想要的值,但$ current.state直接只给出父状态。
如果有人有更好的建议如何做到这一点(以有条不紊的方式 - 没有自定义的垃圾垃圾),我很乐意接受建议。
谢谢!
更新!代码样本:
我的州的对象参考:
var urlStates = {
en: {
home: {
name: 'home',
url: '/en',
templateUrl: 'templates/'+lang+'/home.html',
abstract: 'true'
},
home_highlights: {
name:'home.highlights',
url: '',
templateUrl: 'templates/'+lang+'/home.highlights.html'
},
home_social:
{
name: 'home.social',
url: '/social',
templateUrl: 'templates/'+lang+'/home.social.html'
},
home_map:
{
name: 'home.map',
url: '/map',
templateUrl: 'templates/'+lang+'/home.map.html'
}
};
我的国家:
$stateProvider
.state(urlStates.en.home)
.state(urlStates.en.home_highlights)
.state(urlStates.en.home_social)
.state(urlStates.en.home_map);
$locationProvider.html5Mode(true);
})
控制器:
.controller('LandingPage', function($translate, $state){
this.state = $state;
this.greeting = "Hello";
});
最后,我在dom中看到的输出:
使用this.state = $ state;
{
"params": {},
"current": {
"name": "home.highlights",
"url": "",
"templateUrl": "templates/en/home.highlights.html" },
"transition": null
}
使用this.state = $ state.current
{
"name": "",
"url": "^",
"views": null,
"abstract": true
}
答案 0 :(得分:78)
这就是我的做法
JAVASCRIPT:
var module = angular.module('yourModuleName', ['ui.router']);
module.run( ['$rootScope', '$state', '$stateParams',
function ($rootScope, $state, $stateParams) {
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
}
]);
HTML:
<pre id="uiRouterInfo">
$state = {{$state.current.name}}
$stateParams = {{$stateParams}}
$state full url = {{ $state.$current.url.source }}
</pre>
示例
答案 1 :(得分:9)
以这种格式回答您的问题非常具有挑战性。
另一方面,你询问有关导航的问题,然后关于当前$state
表现得很奇怪。
对于第一个我会说这是太宽泛的问题而且对于第二个我会说......好吧,你做错了什么或错过了明显的事情:)
采取以下控制器:
app.controller('MainCtrl', function($scope, $state) {
$scope.state = $state;
});
将app
配置为:
app.config(function($stateProvider) {
$stateProvider
.state('main', {
url: '/main',
templateUrl: 'main.html',
controller: 'MainCtrl'
})
.state('main.thiscontent', {
url: '/thiscontent',
templateUrl: 'this.html',
controller: 'ThisCtrl'
})
.state('main.thatcontent', {
url: '/thatcontent',
templateUrl: 'that.html'
});
});
然后是简单的HTML模板
<div>
{{ state | json }}
</div>
会“打印出来”,例如以下
{
"params": {},
"current": {
"url": "/thatcontent",
"templateUrl": "that.html",
"name": "main.thatcontent"
},
"transition": null
}
我提出了一个显示此问题的小例子,使用ui.router
和pascalprecht.translate
作为菜单。我希望你发现它有用并弄清楚你做错了什么。
此处是Plunker http://plnkr.co/edit/XIW4ZE
撷取画面
<小时/>
答案 2 :(得分:4)
在我目前的项目中,解决方案如下所示:
我创建了一个抽象的语言状态
$stateProvider.state('language', {
abstract: true,
url: '/:language',
template: '<div ui-view class="lang-{{language}}"></div>'
});
项目中的每个州都必须依赖这个州
$stateProvider.state('language.dashboard', {
url: '/dashboard'
//....
});
语言切换按钮调用自定义功能:
<a ng-click="footer.setLanguage('de')">de</a>
相应的函数看起来像这样(当然在控制器内):
this.setLanguage = function(lang) {
FooterLog.log('switch to language', lang);
$state.go($state.current, { language: lang }, {
location: true,
reload: true,
inherit: true
}).then(function() {
FooterLog.log('transition successfull');
});
};
这有效,但是有一个更好的解决方案只是从html更改状态参数中的值:
<a ui-sref="{ language: 'de' }">de</a>
不幸的是,这不起作用,请参阅https://github.com/angular-ui/ui-router/issues/1031
答案 3 :(得分:3)
使用超时
$timeout(function () { console.log($state.current, 'this is working fine'); }, 100);
答案 4 :(得分:1)
$state
围绕$timeout
缠绕,它对我有用。
例如,
(function() {
'use strict';
angular
.module('app')
.controller('BodyController', BodyController);
BodyController.$inject = ['$state', '$timeout'];
/* @ngInject */
function BodyController($state, $timeout) {
$timeout(function(){
console.log($state.current);
});
}
})();
答案 5 :(得分:0)
它只是因为角度的加载时间才能给你当前的状态。
如果您尝试使用int i{}, j{};
函数获取当前状态,那么它会在$timeout
$state.current.name