我试图在每次单击按钮时创建一个动态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>


我想我已经很接近了,但是我很难将数据从控制器传递到函数中,需要更改templateUrl

最佳答案

检查更新的监听器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:'/:currentFloor')中添加参数'currentFloor。然后使用以下参数重新加载状态:$state.go('home', {currentFloor : 2}, {reload: true})

当您处于相同状态时,选项reload:true对于ui路由器重新加载状态很重要。

如果需要在$ stateParams和作用域中的对象之间做一些工作,建议您使用resolve函数。

09-13 03:08