AngularJS中使用ng-repeat结合ui-sref渲染菜单的实现问题
如何用ng-repeat渲染带ui-sref的动态菜单?
嘿,这个问题我之前踩过坑!用ng-repeat结合ui-sref动态生成菜单的时候,确实容易碰到绑定无效的情况,咱们一步步来解决它。
你尝试的ui-sref="{{menu.sref}}"和ui-sref="menu.sref"两种写法都没起效,核心问题要么是绑定方式不对,要么是你的menu数据结构/状态定义有问题。
先明确正确的绑定姿势
ui-sref本质是绑定ui-router定义的状态名,动态绑定的时候必须用插值表达式把menu对象里的sref值传递进去,也就是正确写法应该是:
<a ui-sref="{{menu.sref}}">{{menu.name}}</a>
而ui-sref="menu.sref"之所以无效,是因为它会把menu.sref当成一个固定的状态名去查找,而不是读取你menu对象里的sref属性值。
确保你的数据结构和状态定义正确
首先,你的menu数组里的sref值必须和ui-router中定义的状态名完全一致,包括嵌套状态的点分隔符。比如:
1. 定义路由状态
angular.module('myApp', ['ui.router']) .config(function($stateProvider, $urlRouterProvider) { $urlRouterProvider.otherwise('/home'); $stateProvider .state('home', { url: '/home', template: '<h1>首页</h1>' }) .state('users.list', { url: '/users/list', template: '<h2>用户列表</h2>' }) .state('user.detail', { url: '/user/:id', template: '<h2>用户ID: {{$stateParams.id}}</h2>' }); });
2. 准备正确的menu数据
// 在控制器中定义菜单数据 $scope.menus = [ { name: '首页', sref: 'home' }, { name: '用户列表', sref: 'users.list' }, { name: '用户1详情', sref: 'user.detail({id: 1})' } // 带参数的状态写法 ];
3. 用ng-repeat渲染菜单
<ul> <li ng-repeat="menu in menus"> <a ui-sref="{{menu.sref}}">{{menu.name}}</a> </li> </ul> <!-- 别忘了添加ui-view用来渲染状态内容 --> <div ui-view></div>
带参数的进阶写法
如果你的参数也是动态的(比如从menu对象里读取),可以用ui-sref-opts来传递参数:
调整menu数据结构
$scope.menus = [ { name: '用户1详情', sref: 'user.detail', params: { id: 1 } }, { name: '用户2详情', sref: 'user.detail', params: { id: 2 } } ];
模板中绑定参数
<a ui-sref="{{menu.sref}}" ui-sref-opts="{ params: menu.params }">{{menu.name}}</a>
常见排查点
- 检查状态名拼写是否完全一致,包括大小写、嵌套状态的点分隔符(比如
users.list不能写成userList) - 确保已经正确引入了
ui.router模块 - 如果是AngularJS 1.3+版本,可以尝试用一次性绑定
ui-sref="::menu.sref"来避免不必要的监听,提升性能
内容的提问来源于stack exchange,提问作者Bimal Poudel
相关产品推荐
相关产品推荐

