在角度材料w/ui-router中每个标签分开控制器

Sei*_*ria 23 javascript angularjs angular-ui-router material-design angular-material

我正在尝试实现我的md-tabs每一个md-tab都是使用角度材料的独立状态.我目前的标记看起来像这样:

  md-tabs.is-flex.auto-flex(selected="selectedIndex",layout="vertical")
     md-tab(on-select="selectTab(0)",label="Player",ui-sref="state1")
        div.tab(ui-view)

     md-tab(on-select="selectTab(1)",label="Map",ui-sref="state2")
        div.tab(ui-view)
Run Code Online (Sandbox Code Playgroud)

不过,我不认为这是ui-router的有效标记.是否可以使用当前版本的angular-material和ui-router进行此操作?

Jam*_*cer 46

如果你命名你的ui-view元素(例如<div ui-view="player"></div>),那么你可以在$ stateProvider配置中定位它们.

因此,在template.html中给出以下标记:

<md-tabs md-selected="currentTab">
    <md-tab label="Player" ui-sref="tabs.player">
        <div ui-view="player"></div>
    </md-tab>
    <md-tab label="Map" ui-sref="tabs.map">
        <div ui-view="map"></div>
    </md-tab>
</md-tabs>
Run Code Online (Sandbox Code Playgroud)

您可以ui-view使用以下$ stateProvider配置来定位每个元素(并更新currentTab索引):

.state('tabs', {
    abstract: true,
    url: '/tabs',
    templateUrl: 'template.html',
    controller: function($scope) {
      $scope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) {
        $scope.currentTab = toState.data.selectedTab;
      });
    }
  })
.state('tabs.player', {
    url: '/player',
    data: {
      'selectedTab': 0
    },
    views: {
      'player': {
        controller: playerController
      }
    }
  })
.state('tabs.map', {
    url: '/map',
    data: {
      'selectedTab': 1
    },
    views: {
      'map': {
        controller: mapController
      }
    }
  })
Run Code Online (Sandbox Code Playgroud)

您现在需要做的就是定义playerControllermapController.您仍然可以将部分模板等加载到其中ui-view,请参阅多命名视图部分.

  • 我成功地实现了这一点.很不错的答案,并感谢有关设置`selectedTab`位 - 起初我很困惑,但后来我刷新页面,它打我. (2认同)
  • 谢谢..但它仍然没有按预期工作.尝试将模板添加到播放器/地图视图中.单击选项卡时它会更新,但导航时将无法更新... (2认同)

Jim*_*Bob 7

我能够通过这样做来实现这一目标

的index.html

<md-toolbar ng-controller="NavigationController as vm"
            ng-include="'app/components/navbar/navbar.html'"
            class="md-default-theme" >
</md-toolbar>

<md-content ui-view
            md-scroll-y
            class="md-default-theme"
            role="main"
            flex>
</md-content>
Run Code Online (Sandbox Code Playgroud)

navbar.html

<md-tabs md-selected="vm.currentTab" md-stretch-tabs="always" class="main-toolbar">
    <md-tab label="Home" ui-sref="home"></md-tab>
    <md-tab label="Portfolio" ui-sref="portfolio"></md-tab>
    <md-tab label="Contact" ui-sref="contact"></md-tab>
</md-tabs>
Run Code Online (Sandbox Code Playgroud)

app.js

$stateProvider
    .state('home', {
        url: '/',
        data: {
            'selectedTab' : 0
        },
        templateUrl: 'app/components/main/main.html',
        controller: 'MainController as vm'
    })
    .state('portfolio', {
        url: '/portfolio',
        data: {
            'selectedTab' : 1
        },
        templateUrl: 'app/components/portfolio/portfolio.html',
        controller: 'PortfolioController as vm'
    })
    .state('contact', {
        url: '/contact',
        data: {
            'selectedTab' : 2
        },
        templateUrl: 'app/components/contact/contact.html',
        controller: 'ContactController as vm'
    });
Run Code Online (Sandbox Code Playgroud)

navigation.controller.js

function NavigationController($scope) {

    var vm = this;

    $scope.$on('$stateChangeSuccess', function(event, toState) {
        vm.currentTab = toState.data.selectedTab;
    });

}
Run Code Online (Sandbox Code Playgroud)


soo*_*ote 6

对于任何来自Google并且不使用ui-router的人,你可以使用默认的ng-router做同样的事情:在你的索引文件中放置标签代码:

<md-tabs md-selected="0" ng-controller="TabCtrl">
    <md-tab ng-repeat="tab in tabs" md-on-select="switchTab($index)" label="{{tab}}">
        <div ng-view></div>
     </md-tab>
</md-tabs>
Run Code Online (Sandbox Code Playgroud)

然后创建TabCtrl:

// Define the titles of your tabs
$scope.tabs = ["Player", "Map"];

// Change the tab
$scope.switchTab = function(index) {
    switch(index) {
        case 0: $location.path('/player');break;
        case 1: $location.path('/map');break;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后在配置中定义您的路线:

.when( '/player', {
    templateUrl: 'partials/player.html',
    controller: 'PlayerCtrl'
})
.when( '/map', {
    templateUrl: 'partials/map.html',
    controller: 'MapCtrl'
});
Run Code Online (Sandbox Code Playgroud)