如何在 Angular 中使用 UI Router 正确实现多个视图? [英] How to correctly implement multiple views with UI Router in Angular?
问题描述
我正在尝试实现一个包含两个主要内容窗格"的站点(想象一下两列,每列是页面宽度的一半).窗格应该能够相互独立地更改并拥有自己的控制器并能够在彼此之间传递数据(因此用户可以浏览左侧窗格上的一堆页面,而右侧窗格保持不变而无需重新加载和反之亦然,左窗格中的更改可以更新右窗格中显示的数据).
我已经浏览了大量关于 UI 路由器的示例/教程,但似乎无法找到一个很好的示例来说明如何实现我正在尝试做的事情.所有这些似乎都只显示单个嵌套视图的示例(因此在更大的视图中显示单个视图)或显示多个视图,但不显示如何更改彼此独立的视图.
我想在 index.html 文件中使用单个
(而不是多个 ui-views)来做到这一点,以便我可以在单父 ui-view 中发生所有事情,而不是在 index.html 文件中.
现在我有类似以下 js 文件的内容:
config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {$urlRouterProvider.otherwise('/home');$stateProvider.state('家', {网址:'/家',意见:{'': { templateUrl: 'views/home.html' },'离开家': {templateUrl: 'views/charting/chartHome.html',},'right@home':{templateUrl: 'views/view1.html',控制器:'View1Ctrl'}}});}]);
以及 home.html 的以下 HTML:
<h1>这是家</h1><div ui-view='left'>
<div ui-view='right'>
有人可以帮忙吗?或者这是考虑网站的错误方式?如果是这样,我该怎么办?
谢谢!
使用 ui-router 解决这个问题非常复杂.
我创建了这个 fiddle 来尝试 ui-router 嵌套状态.它有效,但它很快变得丑陋.
它是这样工作的:home.main.left
路由只改变左视图并使用来自 home.main
的右视图.让两个视图状态相互独立会更好,但我不确定如何使用 ui-router 做到这一点.
我认为最好使用 ui-router 进行左侧部分的导航,并为右侧部分使用自定义指令(或相反).要与指令通信,您可以使用 $emit/$broadcast
.
通过链接ui-sref
或$state.go(...)
方法也可以通过指令更改左侧部分的路线.>
请查看下面或此 jsfiddle 中的演示.
angular.module('demoApp', ['ui.router']).config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {$urlRouterProvider.otherwise('/home');$stateProvider.state('家', {templateUrl: 'views/home.html',摘要:真实}).state('home.main', {网址:'/家',templateUrl: 'views/charting/chartHome.html',控制器:'左Ctrl'}).state('home.left', {模板:'home.left <a href="#" ui-sref="home.left1">left1 change</a><br/>{{hello}}',控制器:'左Ctrl'}).state('home.left1', {模板:'home.left1 <a href="#" ui-sref="home.left2">left2 change</a>'}).state('home.left2', {模板:'home.left2 <a href="#" ng-click="triggerDirective()">更改指令</a>',控制器:功能($范围){$scope.triggerDirective = function() {console.log('做指令动作');$scope.$emit('rightContent:changeMsg', '新内容');//发射到 rootscope 因为 rightcontent 不是 leftcontent 的孩子};}})}]).directive('rightContent', function() {返回 {限制:'EA',模板:'来自指令的一些静态内容或其他内容.<strong>{{message}}</strong>',控制器:函数($scope,$rootScope){$scope.message = 'hello from 指令.';$rootScope.$on('rightContent:changeMsg', function(evt, message) {控制台日志(消息);$scope.message = 消息;});}}}).controller('LeftCtrl', function($scope){$scope.hello = '来自左边的你好';}).controller('appController', function($scope) {});
.left {向左飘浮;宽度:50%;高度:200px;背景:浅绿色;}.对 {浮动:对;宽度:50%;高度:200px;背景:浅灰色;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.4/angular.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.15/angular-ui-router.js"></script><link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"/><div ng-app="demoApp" ng-controller="appController"><script type="text/ng-template" id="views/home.html"><div><h1>这是家</h1>
<div class="wrapper"><div ui-view="" class="left">
<div class="right"><权限内容></权限内容>
<a href="#" ui-sref="home.main">home</a>