使用 ui-router 在不改变状态的情况下简单地启动一个功能
Using ui-router to simply launch a function without changing state
我有一个 LanguageSwitcher 服务和一个 LanguageSwitcher.switchLanguage() 函数,可以用来在法语和英语之间切换语言。
我现在正在尝试使用 ui-路由器状态来执行该功能,它似乎可以工作,因为我可以看到 'translated' class(它在 'french' 和 'english') 检查时更改标记,但页面变为空白,就像它试图加载不存在的视图或其他内容一样。
所以我想防止这种行为,并尽可能简单地执行函数 'without changing the state'。
<a ui-sref="language">Toggle</a>
这是 ui-路由器配置:
'use strict';
(function() {
angular.module('frontApp')
.run(['$rootScope', '$state', '$stateParams', function($rootScope, $state, $stateParams) {
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
}]
)
.config(['$urlRouterProvider', '$stateProvider', '$locationProvider', function($urlRouterProvider, $stateProvider, $locationProvider){
$urlRouterProvider
.otherwise('/');
$stateProvider
.state('home', {
url: '/',
templateUrl: '/views/home.html',
controller: 'HomeCtrl'
})
.state('home.rules', {
url: '^/rules',
templateUrl: '/views/rules.html'
})
.state('home.terms', {
url: '^/terms',
templateUrl: '/views/terms.html'
})
.state('home.faq', {
url: '^/faq',
templateUrl: '/views/faq.html'
})
.state('language', {
controller: ['LanguageSwitcher', function(LanguageSwitcher) {
LanguageSwitcher.switchLanguage();
}]
});
$locationProvider.html5Mode(true);
}]);
}());
这是因为我的菜单是动态的,切换不是导航栏的最后一项:
<header ng-controller="NavbarCtrl">
<h1><a class="navbar-brand" ui-sref="home">{{ 'siteTitle' | translate }}</a></h1>
<ul class="nav navbar-nav navbar-right">
<li ng-repeat="item in menu" ui-sref-active="active">
<a ui-sref="{{item.state}}" ng-href="{{item.link}}">{{item.title}}</a>
</li>
</ul>
</header>
navbar.js 文件:
'use strict';
(function() {
angular.module('frontApp').controller('NavbarCtrl', ['$scope', '$translate', '$location', '$rootScope', function ($scope, $translate, $location, $rootScope) {
$rootScope.$on('$translateChangeSuccess', function () {
$translate(['linkHome', 'linkRules', 'linkTerms', 'linkFAQ', 'language', 'otherLanguage', 'linkMainSite']).then(function (translations) {
$scope.menu = [
{
'title': translations.linkHome,
'link': '/',
'state': 'home'
},
{
'title': translations.linkRules,
'link': '/rules',
'state': 'home.rules'
},
{
'title': translations.linkTerms,
'link': '/terms',
'state': 'home.terms'
},
{
'title': translations.linkFAQ,
'link': '/faq',
'state': 'home.faq'
},
{
'title': translations.language,
'link': '/'+translations.otherLanguage,
'state': 'language'
},
//{
// 'title': translations.linkMainSite,
// 'link': 'http://'+translations.linkMainSite,
// 'state': ''
//}
];
//$scope.isActive = function(route) {
// return route === $location.path();
//};
});
});
}]);
}());
我错过了什么?非常感谢您的时间和帮助。
从您的post的许多评论中可以推断出这一点:没有理由使用状态来调用语言切换器。
相反,您可能只想使用 ng-controller 在菜单中包含控制器,或者创建一个 component/directive,然后通过使用 ngClick 调用服务方法。
基于如何将 ng-repeat
用于菜单 link 的问题,一个建议是使用 ng-if
为 [= 创建一个不同的 link 13=] 使用 ng-click
来管理切换并且不为其设置任何 href
属性
类似
<li ng-repeat="item in menu" ui-sref-active="active">
<a ng-if="item.state !== 'language'" ui-sref="{{item.state}}" ng-href="{{item.link}}">{{item.title}}</a>
<a ng-if="item.state === 'language'" ng-click="switchLang()">{{item.title}}</a>
</li>
然后在 NavbarCtrl 控制器中 switchLang()
调用您的语言服务
我有一个 LanguageSwitcher 服务和一个 LanguageSwitcher.switchLanguage() 函数,可以用来在法语和英语之间切换语言。
我现在正在尝试使用 ui-路由器状态来执行该功能,它似乎可以工作,因为我可以看到 'translated' class(它在 'french' 和 'english') 检查时更改标记,但页面变为空白,就像它试图加载不存在的视图或其他内容一样。
所以我想防止这种行为,并尽可能简单地执行函数 'without changing the state'。
<a ui-sref="language">Toggle</a>
这是 ui-路由器配置:
'use strict';
(function() {
angular.module('frontApp')
.run(['$rootScope', '$state', '$stateParams', function($rootScope, $state, $stateParams) {
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
}]
)
.config(['$urlRouterProvider', '$stateProvider', '$locationProvider', function($urlRouterProvider, $stateProvider, $locationProvider){
$urlRouterProvider
.otherwise('/');
$stateProvider
.state('home', {
url: '/',
templateUrl: '/views/home.html',
controller: 'HomeCtrl'
})
.state('home.rules', {
url: '^/rules',
templateUrl: '/views/rules.html'
})
.state('home.terms', {
url: '^/terms',
templateUrl: '/views/terms.html'
})
.state('home.faq', {
url: '^/faq',
templateUrl: '/views/faq.html'
})
.state('language', {
controller: ['LanguageSwitcher', function(LanguageSwitcher) {
LanguageSwitcher.switchLanguage();
}]
});
$locationProvider.html5Mode(true);
}]);
}());
这是因为我的菜单是动态的,切换不是导航栏的最后一项:
<header ng-controller="NavbarCtrl">
<h1><a class="navbar-brand" ui-sref="home">{{ 'siteTitle' | translate }}</a></h1>
<ul class="nav navbar-nav navbar-right">
<li ng-repeat="item in menu" ui-sref-active="active">
<a ui-sref="{{item.state}}" ng-href="{{item.link}}">{{item.title}}</a>
</li>
</ul>
</header>
navbar.js 文件:
'use strict';
(function() {
angular.module('frontApp').controller('NavbarCtrl', ['$scope', '$translate', '$location', '$rootScope', function ($scope, $translate, $location, $rootScope) {
$rootScope.$on('$translateChangeSuccess', function () {
$translate(['linkHome', 'linkRules', 'linkTerms', 'linkFAQ', 'language', 'otherLanguage', 'linkMainSite']).then(function (translations) {
$scope.menu = [
{
'title': translations.linkHome,
'link': '/',
'state': 'home'
},
{
'title': translations.linkRules,
'link': '/rules',
'state': 'home.rules'
},
{
'title': translations.linkTerms,
'link': '/terms',
'state': 'home.terms'
},
{
'title': translations.linkFAQ,
'link': '/faq',
'state': 'home.faq'
},
{
'title': translations.language,
'link': '/'+translations.otherLanguage,
'state': 'language'
},
//{
// 'title': translations.linkMainSite,
// 'link': 'http://'+translations.linkMainSite,
// 'state': ''
//}
];
//$scope.isActive = function(route) {
// return route === $location.path();
//};
});
});
}]);
}());
我错过了什么?非常感谢您的时间和帮助。
从您的post的许多评论中可以推断出这一点:没有理由使用状态来调用语言切换器。
相反,您可能只想使用 ng-controller 在菜单中包含控制器,或者创建一个 component/directive,然后通过使用 ngClick 调用服务方法。
基于如何将 ng-repeat
用于菜单 link 的问题,一个建议是使用 ng-if
为 [= 创建一个不同的 link 13=] 使用 ng-click
来管理切换并且不为其设置任何 href
属性
类似
<li ng-repeat="item in menu" ui-sref-active="active">
<a ng-if="item.state !== 'language'" ui-sref="{{item.state}}" ng-href="{{item.link}}">{{item.title}}</a>
<a ng-if="item.state === 'language'" ng-click="switchLang()">{{item.title}}</a>
</li>
然后在 NavbarCtrl 控制器中 switchLang()
调用您的语言服务