以前有人问过,从答案看起来不太好。我想询问一下这个示例代码......
我的应用程序在提供它的服务中加载当前项目。有几个控制器可以在不重新加载项目的情况下操作项目数据。
如果尚未设置,我的控制器将重新加载该项目,否则,它将在控制器之间使用服务中当前加载的项目。
问题 :我想在不重新加载 Item.html 的情况下为每个控制器使用不同的路径。
1)这可能吗?
2)如果这是不可能的,有没有更好的方法让每个控制器都有一个路径而不是我在这里想出的?
应用程序.js
var app = angular.module('myModule', []). config(['$routeProvider', function($routeProvider) { $routeProvider. when('/items', {templateUrl: 'partials/items.html', controller: ItemsCtrl}). when('/items/:itemId/foo', {templateUrl: 'partials/item.html', controller: ItemFooCtrl}). when('/items/:itemId/bar', {templateUrl: 'partials/item.html', controller: ItemBarCtrl}). otherwise({redirectTo: '/items'}); }]);
项目.html
<!-- Menu --> <a id="fooTab" my-active-directive="view.name" href="#/item/{{item.id}}/foo">Foo</a> <a id="barTab" my-active-directive="view.name" href="#/item/{{item.id}}/bar">Bar</a> <!-- Content --> <div class="content" ng-include="" src="view.template"></div>
控制器.js
// Helper function to load $scope.item if refresh or directly linked function itemCtrlInit($scope, $routeParams, MyService) { $scope.item = MyService.currentItem; if (!$scope.item) { MyService.currentItem = MyService.get({itemId: $routeParams.itemId}); $scope.item = MyService.currentItem; } } function itemFooCtrl($scope, $routeParams, MyService) { $scope.view = {name: 'foo', template: 'partials/itemFoo.html'}; itemCtrlInit($scope, $routeParams, MyService); } function itemBarCtrl($scope, $routeParams, MyService) { $scope.view = {name: 'bar', template: 'partials/itemBar.html'}; itemCtrlInit($scope, $routeParams, MyService); }
解析度。
状态 :使用接受的答案中推荐的搜索查询允许我提供不同的 url,而无需重新加载主控制器。
var app = angular.module('myModule', []). config(['$routeProvider', function($routeProvider) { $routeProvider. when('/items', {templateUrl: 'partials/items.html', controller: ItemsCtrl}). when('/item/:itemId/', {templateUrl: 'partials/item.html', controller: ItemCtrl, reloadOnSearch: false}). otherwise({redirectTo: '/items'}); }]);
<!-- Menu --> <dd id="fooTab" item-tab="view.name" ng-click="view = views.foo;"><a href="#/item/{{item.id}}/?view=foo">Foo</a></dd> <dd id="barTab" item-tab="view.name" ng-click="view = views.bar;"><a href="#/item/{{item.id}}/?view=foo">Bar</a></dd> <!-- Content --> <div class="content" ng-include="" src="view.template"></div>
function ItemCtrl($scope, $routeParams, Appts) { $scope.views = { foo: {name: 'foo', template: 'partials/itemFoo.html'}, bar: {name: 'bar', template: 'partials/itemBar.html'}, } $scope.view = $scope.views[$routeParams.view]; }
指令.js
app.directive('itemTab', function(){ return function(scope, elem, attrs) { scope.$watch(attrs.itemTab, function(val) { if (val+'Tab' == attrs.id) { elem.addClass('active'); } else { elem.removeClass('active'); } }); } });
我的部分内容中包含ng-controller=...
ng-controller=...
如果您不必使用#/item/{{item.id}}/fooand #/item/{{item.id}}/barbut #/item/{{item.id}}/?fooand#/item/{{item.id}}/?bar之类的 URL,则可以将您的路由设置为/item/{{item.id}}/( https://docs.angularjs.org/api/ngRoute/provider/$routeProvider )。如果 url 的搜索部分发生变化,这会告诉 AngularJS 不要重新加载视图。reloadOnSearch``false
#/item/{{item.id}}/foo
#/item/{{item.id}}/bar
#/item/{{item.id}}/?foo
#/item/{{item.id}}/?bar
/item/{{item.id}}/
reloadOnSearch``false