2015-04-02 73 views
1

我使用的角度UI路由器創建一個主從頁面。我已經能夠使它發揮作用 - 當我點擊主記錄,該記錄的ID被添加到URL和詳細信息視圖顯示此記錄的詳細信息。然而,我有兩個問題:AngularJS:讓UI-路由器的工作沒有一個URL

  1. 是否有可能使這項工作沒有改變的網址?據我瞭解,UI路由器都是關於狀態的變化,不一定是網址的變化。但是,如果我從路由器狀態中刪除url屬性,則不會顯示詳細信息。
  2. 我的詳細狀態相關聯的模板是一個指令。目前該指令使用$stateParams獲取主記錄的ID。這使它依賴於UI路由器。是否有可能使用隔離範圍傳遞此id?

這裏的是我的代碼的關鍵部分:

路由器的配置如下:

$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; 
} 

注意控制捕獲的id所選主記錄使用$stateParams。我希望通過切換到隔離範圍來消除指令中的這種依賴關係。因此,與UI路由器狀態相關的模板應該如下所示:

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

這可能嗎?

+0

您是否在尋找['resolve'](https://docs.angularjs.org/api/ngRoute/provider/$routeProvider)? Resolve允許您在調用控制器之前手動連接注入。 '{[...],解析:函數(){返回42}}' – 2015-04-02 22:30:51

回答

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

+0

感謝Radim,這工作,但我不是很興奮添加$狀態和$ stateParams到$ rootScope。這基本上使他們全球化。它看起來不像UI路由器是非常友好的。一個非常必須公開控制器。 – Naresh 2015-04-04 22:16:21

+0

我的解決方案不僅工作正常,而且是原生UI路由器方法! ;)在這裏檢查https://github.com/angular-ui/ui-router/blob/master/sample/app/app.js#L10你會很高興;)。實際上,UI-Router視圖代表一個框架,我們可以放置指令的地方。通常我們放置的不僅僅是一個,而是**你的願望**和*我的例子*事實上符合非常原生的方式如何在**視圖**內使用**指令**。我會說...無論如何欣賞UI-Router – 2015-04-05 05:20:03

+0

Radim,感謝您的參考。它給了我更多的信心,所以我將你的答案標記爲正確:-)!作爲一個方面說明,我試圖通過將所選orderId發送到詳細信息視圖,但使用決心發送完整訂單明細來進一步推動這種方法。我這樣做的方法是在我的路由器配置中創建一箇中間控制器,並使用它來與指令進行協調:'controller:['orderdetail',function(orderdetail){this.orderdetail = orderdetail; }]' – Naresh 2015-04-05 16:55:07