這裏是我的提問,並內嵌代碼的要求創建的演示:http://jsfiddle.net/Gncja/1/AngularJs:有狀態的客戶端路由
<script type='text/ng-template' id='root.html'>
<list template-id='sidebar.templateId' selected-item-id='sidebar.selectedItemId'></list>
</script>
<script type='text/ng-template' id='sidebar.html'>
<ul style='width:100%;' class='nav nav-list bs-docs-sidenav'>
<li ng-repeat='item in data' ng-class="{active:item.id==selectedItemId}">
<a ng-href='#/{{item.id}}'>
<i class=icon-chevron-right></i>
<span ng-bind='item.text'></span>
</a>
</li>
</ul>
</script>
<body ng-app='main'>
<div ng-view></div>
</body>
function RootCtrl($scope, $routeParams){
$scope.sidebar = {
templateId: 'sidebar',
selectedItemId: $routeParams.navItemId
};
}
RootCtrl.$inject = ['$scope','$routeParams'];
angular.module('main', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/:navItemId', {
templateUrl: 'root.html',
controller: RootCtrl
}).
otherwise({redirectTo: '/1'});
}]).
directive('list', function(){
return {
restrict: 'E',
replace: true,
scope:{
'templateId': '=',
'selectedItemId':'='
},
template:'<ng-include src="templateUrl"></ng-include>',
controller: function($scope, $element, $attrs){
$scope.templateUrl = $scope.templateId + '.html';
$scope.data = [
{'id':'1', text:'lorem ipsum'},
{'id':'2', text:'dolor sit amet'},
];
}
};
});
這是一小部分應用程序的我一直在努力,但它清楚地表明它在做什麼。在頁面中有導航菜單,菜單項是鏈接到由初始化根控制器等的angular.js路由處理的哈希,這很難描述,但代碼示例清楚地顯示了它。 每次單擊導航菜單項時,整個頁面內容都會重新呈現,這個問題 - 路由是無狀態的,它對前一個狀態一無所知。當用戶只是在菜單項(或瀏覽器歷史記錄)之間導航時,我想通過重新使用導航菜單數據/模板渲染結果來避免這種情況。可能嗎?我相信這一點,只是想看看是否有人有好的想法。謝謝!
UPDATE: 我發現的東西,可能會幫助我: http://www.bennadel.com/blog/2420-Mapping-AngularJS-Routes-Onto-URL-Parameters-And-Client-Side-Events.htm
我試着點擊的jsfiddle側欄菜單,它似乎並不被重新渲染。而且,我嘗試點擊瀏覽器「前進」「後退」歷史按鈕,它也在工作。你解決了這個問題嗎?或者您正面臨其他一些問題? – venkat
它被重新渲染。注意在$ scope.templateUrl = $ scope.templateId +'.html';中設置斷點。一行代碼並開始導航。在每次點擊/瀏覽器歷史記錄後,您會看到代碼在該行停止,並且頁面在停止時刻爲空,然後繼續執行該頁面重新呈現。 – sovo2014