AngularJS:在没有URL的情况下使UI-Router工作

时间:2015-04-02 22:02:02

标签: angularjs angular-ui-router angular-directive

我正在使用Angular UI路由器创建主详细信息页面。我已经能够使它工作 - 当我点击主记录时,该记录的id被附加到URL,详细视图显示该记录的详细信息。但是我有两个问题:

  1. 是否可以在不更改URL的情况下完成此工作?根据我的理解,UI路由器是关于状态更改,不一定是URL更改。但是,如果我从路由器状态中删除url属性,则不会显示详细信息。
  2. 与我的详细状态相关联的模板是一个指令。目前,该指令使用$stateParams获取主记录的id。这使它依赖于UI路由器。是否可以使用隔离范围传递此ID?
  3. 以下是我的代码的关键部分:

    路由器配置如下:

    $stateProvider
        .state('orderdetail', {
            url: '/orders/:id',
            template: '<my-order-detail></my-order-detail>'
        });
    }
    

    如上面#1中所述,如果我注释掉网址,则详细信息会停止显示。为什么?有没有办法让这项工作没有要更改的URL?

    选择主记录后,我按如下方式更改状态:

    $state.go('orderdetail', {
        id: vm.selectedOrderId
    });
    

    以下是显示详细信息的指令代码:

    angular.module('app.orderdetail', []);
    
    angular.module('app.orderdetail')
        .directive('myOrderDetail', orderDetailDirective)
        .controller('OrderDetailController', OrderDetailController);
    
    // ----- orderDetailDirective -----
    orderDetailDirective.$inject = [];
    
    function orderDetailDirective() {
    
        var directive = {
            restrict: 'E',
            templateUrl: 'components/orderdetail/orderdetail.html',
            scope: {
                id: '='
            },
            controller: 'OrderDetailController',
            controllerAs: 'vm'
        };
    
        return directive;
    }
    
    // ----- OrderDetailController -----
    OrderDetailController.$inject = ['$stateParams'];
    
    /* @ngInject */
    function OrderDetailController($stateParams) {
        var vm = this;
        vm.id = $stateParams.id;
    }
    

    请注意,控制器使用$stateParams捕获所选主记录的ID。我希望通过切换到隔离范围来删除指令中的这种依赖关系。因此,与UI路由器状态关联的模板应如下所示:

    template: '<my-order-detail data-id={{vm.id}}></my-order-detail>'
    

    这可能吗?

1 个答案:

答案 0 :(得分:0)

如果我确实理解了您的目标,我们可以使用 template ,将 id 传递给指令(及其孤立的范围)

a working plunker

$stateProvider
    .state('orderdetail', {
      url: '/orders/:id',
      //template: '<my-order-detail></my-order-detail>',
      template: '<my-order-detail data-id="$stateParams.id"></my-order-detail>',
    });

刚刚将其添加到我们的代码中(因此我们不需要控制器,$stateParams已经在每个视图状态模板的范围内)

.run(['$rootScope', '$state', '$stateParams',
    function($rootScope, $state, $stateParams) {
      $rootScope.$state = $state;
      $rootScope.$stateParams = $stateParams;
    }
])

这就是它所谓的方式

<a ui-sref="orderdetail({id:1})">
<a ui-sref="orderdetail({id:2})">

action here

中查看