AngularJS UI-router如何将一个状态视图加载到另一个顶级状态的嵌套视图中?
AngularJS UI-router如何将一个状态视图加载到另一个顶级状态的嵌套视图中?
我有一个名为container
的顶级状态,其中包含了名为dashboard
和feed
的命名视图。
在dashboard
视图模板中,我有一个,我想在其中加载
tickers
状态,我应该如何做到这一点?
这是通过在命名视图dashboard@container
中添加一些内容来完成的吗?
Container模块
// Container模块 //////////////////////////////////////////////////////////////////////////////// var container = angular.module('container', [ 'ui.router' ]) container.config(function($stateProvider) { const container = { name: 'container', url: '/container', views: { '': { templateUrl: 'container-template.html', controller: function($scope) { console.log('CONTAINER视图$state'); } }, 'dashboard@container': { templateUrl: 'dashboard-template.html', controller: function($scope) { console.log('DASHBOARD视图$state'); } }, 'feed@container': { templateUrl: 'feed-template.html', controller: function($scope) { console.log('FEED视图$state'); } } } } $stateProvider.state(container); });
Container模板
Container状态
Dashboard模板
Dashboard状态
Tickers模块
// Tickers模块 var tickers = angular.module('tickers', ['ui.router']) tickers.config(function($stateProvider) { const tickers = { parent: 'dashboard', name: 'tickers', url: '/tickers', params: { ticker: {} }, views: { '': { templateUrl: 'tickers-template.html', controller: function($scope, $state) { console.log('TICKERS视图$state'); $scope.tickers = [ { id: 1, ticker: 'AAPL' }, { id: 2, ticker: 'GOOG' }, { id: 3, ticker: 'TWTR' } ]; $scope.clickTicker = function(ticker) { console.log('ticker', ticker) $state.go('tags', { ticker: ticker }); } } }, 'tags@tickers': { templateUrl: 'tags-template.html', controller: function($scope) { console.log('TAGS视图$state'); } } } } $stateProvider.state(tickers); })
主要的tickersApp模块
// TickersApp模块 //////////////////////////////////////////////////////////////////////////////// var tickersApp = angular.module('tickersApp', ['ui.router', 'container', 'tickers']); tickersApp.config(function($stateProvider, $urlRouterProvider) { $urlRouterProvider.otherwise('/login'); const login = { name: 'login', url: '/login', templateUrl: 'login-template.html', bindToController: true, controllerAs: 'l', controller: function($state) { this.login = function() { $state.go('container', { }); } } } $stateProvider .state(login); });
问题:如何在一个顶层状态的嵌套视图中加载另一个状态视图?
解决方法:
我认为你应该在容器上使用不同的状态,如下所示:
$stateProvider .state('container', { url: '/container', templateUrl: '' }) .state('container.feed', { url: '/container/feed', templateUrl: 'partial-home.html' }) .state('container.dashboard', { url: '/container, templateUrl: 'partial-home.html' })
然后使用`ui-sref`。
我想避免使用`ui-sref`,而是在所有控制器内部使用`$state.go`。好吧,如果我采用上述方法,我的问题仍然存在,如何在仪表板状态内实现tickers状态?您能在plnkr上进行分解吗?
问题的出现是因为在AngularJS UI-router中,想要将一个状态视图加载到另一个嵌套视图中的顶级状态。要解决这个问题,可以使用tickers.component组件在dashboard-template.html中实现。
首先,在dashboard-template.html中,添加一个div元素,并设置class为"dashboard-state"。在这个div中,我们将tickers.component作为嵌套视图加载进来。代码如下:
<div class="dashboard-state"> <div class="fl w100"> <em>Dashbaord state</em> </div> <tickers-module></tickers-module> </div>
然后,在tickers-template.html中,我们可以定义一个tickersModule组件,设置它的templateUrl为'tickers-template.html',并添加一个控制器。在控制器中,我们可以定义一个$scope.tickers数组,其中包含了一些股票信息。我们还可以定义一个clickTicker函数,当点击某个股票时,会调用$state.go('tags', { ticker: ticker })方法,将ticker作为参数传递给'tags'状态。
代码如下:
tickers.component('tickersModule', { templateUrl: 'tickers-template.html', controller: function($scope, $state) { console.log('TICKERS component'); $scope.tickers = [ { id: 1, ticker: 'AAPL' }, { id: 2, ticker: 'GOOG' }, { id: 3, ticker: 'TWTR' } ]; $scope.clickTicker = function(ticker) { console.log(' Ticker clicked!', $state) $state.go('tags', { ticker: ticker }); } } });
以上就是解决这个问题的方法。通过使用tickers.component组件,在dashboard-template.html中嵌套加载tickers视图,并在tickers-template.html中定义控制器和相应的逻辑,就能实现将一个状态视图加载到另一个嵌套视图中的顶级状态。