AngularJS+;UI路由器:查看href或UI sref是否与状态匹配
所以目前,我使用UI路由器来管理一组选项卡指令。通过选项卡,我指的是这个UI范例: 每个选项卡都可以有一个与之关联的AngularJS+;UI路由器:查看href或UI sref是否与状态匹配,angularjs,angular-ui-router,Angularjs,Angular Ui Router,所以目前,我使用UI路由器来管理一组选项卡指令。通过选项卡,我指的是这个UI范例: 每个选项卡都可以有一个与之关联的标题、一个图标、一个href或ui sref 例如: <my-tabs> <my-tab title="Tab 1" href="#/tab1"> Content when tab 1 is active! </my-tab> <my-tab title="Tab 2" ui-sref="tabs.numberTwo()
标题
、一个图标
、一个href
或ui sref
例如:
<my-tabs>
<my-tab title="Tab 1" href="#/tab1">
Content when tab 1 is active!
</my-tab>
<my-tab title="Tab 2" ui-sref="tabs.numberTwo()">
Content when tab 2 is active!
</my-tab>
</my-tabs>
欢迎有任何这样做的想法 签出下一个方法:
is()
contains()
includes()
- 所以我终于让它工作了,谢谢大家
我检查attrs.href的$location.href(),并拆分sref以获取attrs.uiSref的stateName
分手是不可取的,但这是我现在能找到的最好的了
$rootScope.$on('$stateChangeSuccess', selectTabIfMatchesState);
function selectTabIfMatchesState() {
//get rid of leading # if it exists, to match against $location.path()
var href = $attr.href && $attr.href.replace(/^#/, '');
//uiSref is laid out as 'stateName({params})', get only 'stateName'
var stateName = $attr.uiSref && $attr.uiSref.split('(')[0];
var includesState = stateName && $state.includes(stateName);
var includesHref = href && $location.path().indexOf(href) === 0;
if (includesHref || includesState) {
// this tab matches current state, go to it!
tabsCtrl.select($scope);
}
}
问题是我没有一个真正的州名来匹配;我要么有一个ui sref(这是一个函数),要么有一个href——我都不能使用这些方法来匹配它们<代码>$state.is('/some/url'),
$state.is('someState({param:value}'))
,等等将无法使用$state.is。是否正确:$state.is('admin.website',{siteId:1})
您能从window.location获取所需的内容吗?@drex排序-不过问题还有另一层。如果用户处于子状态,该怎么办?例如,该选项卡打开“列表”状态的ui视图,但导航到“列表详细信息”状态?我想我可以检查位置,知道它“包含”列表状态,然后激活它,里面的ui视图将呈现子状态。。。我试试看,谢谢。@drex你知道有没有办法从ui-sref属性中获取带有参数的状态?然后我可以对ui sref做同样的操作。ui路由器是否公开了它们在服务或类似服务中内部执行的方式?我会深入研究源代码,但目前没有时间。ui-sref实际上不支持动态值。它“起作用”的事实是意想不到的副作用。啊。。。如果能在小提琴/弹琴上看到一个工作的例子,那就太好了。你能再加一个例子吗
$rootScope.$on('$stateChangeSuccess', selectTabIfMatchesState);
function selectTabIfMatchesState() {
//get rid of leading # if it exists, to match against $location.path()
var href = $attr.href && $attr.href.replace(/^#/, '');
//uiSref is laid out as 'stateName({params})', get only 'stateName'
var stateName = $attr.uiSref && $attr.uiSref.split('(')[0];
var includesState = stateName && $state.includes(stateName);
var includesHref = href && $location.path().indexOf(href) === 0;
if (includesHref || includesState) {
// this tab matches current state, go to it!
tabsCtrl.select($scope);
}
}