UI路由器点击更改templateUrl

时间:2015-12-01 09:30:21

标签: javascript angularjs angular-ui-router

我试图创建一个动态UI路由器,每当你点击一个按钮时,它需要返回带有$ stateParams.currentFloor的templateUrl只会更改,以便它可以在屏幕上的视图中更新。

目前我有:

我的设置:

app.config(function ($urlRouterProvider, $stateProvider) {

    $urlRouterProvider.otherwise('/');

    $stateProvider
        .state('home', {
            url: '/',
            views: {
                "menu-view": {
                    templateUrl: 'partials/menu.html'
                },
                "map-view": {
                    controller: 'mapViewController',
                    templateUrl: function ($stateParams) {
                        return 'partials/floors/floor-' +  $stateParams.currentFloor + '.html'
                    }
                }
            }
        })
});

我的控制器需要保存数据并将其传递给templateUrl函数

app.controller('mapViewController', function ($scope, $stateParams) {
    $scope.currentFloor = $stateParams.currentFloor;
    $scope.currentFloor = 1;
    $scope.addOne = function () {
        $scope.currentFloor = $scope.currentFloor + 1;
        return $stateParams.currentFloor = $scope.currentFloor;
    };
});

只是简单的一个函数,每次点击都会为范围增加+1

<button ng-click="addOne()"></button>

我认为我非常接近,但我很难将数据从我的控制器传递给需要更改模板的函数

2 个答案:

答案 0 :(得分:2)

检查更新的plunker here

一种可能的解决方案:

 var app = angular.module('testTool', ['ui.router'])

  .config(function($urlRouterProvider, $stateProvider) {

     $urlRouterProvider.otherwise('/1');

     $stateProvider
        .state('home', {
            url: '/:currentFloor',
            views: {
                "menu-view": {
                 templateUrl: 'menu.html'
                 },
            "map-view": {
                templateUrl: function ($stateParams) {
                          return 'floor-' +  $stateParams.currentFloor + '.html'
                },
            controller: 'mapViewController'
         }, 
       }
      })
  })

  .controller('mapViewController', function($scope, $stateParams, $state) {

      $scope.addOne = function() {

          $state.go('home', {currentFloor : parseInt($stateParams.currentFloor) + 1}, {reload: true})

      };
  });

在url params (url:'/:currentFloor')中添加参数'currentFloor。然后使用此参数重新加载状态:$state.go('home', {currentFloor : 2}, {reload: true})

选项reload:true对于ui路由器在处于相同状态时重新加载状态非常重要。

如果你需要在你的范围内的$ stateParams和object之间做一些工作,我建议你使用resolve函数。

答案 1 :(得分:0)

尝试在更改$ stateParams后添加$state.go($state.current, {}, {reload: true})