Ven*_*kat 4 javascript asp.net-mvc-4 angularjs angular-ui-router
AngularJS UI路由器命名视图基于用户访问权限加载,而不是在状态路由访问时加载。
$stateProvider
.state("login",
{
url: "/login",
templateUrl: getTemplateUrl("login/Index")
})
.state("main",
{
url: "/main",
views:
{
'': { templateUrl: getTemplateUrl('home/shell') },
'test1@main': { templateUrl: 'home/test1' },
'test2@main': { templateUrl: 'home/test2' },
'test3@main': { templateUrl: getTemplateUrl('home/test3') }
}
});
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,当用户访问状态时main,UI路由器会从服务器加载所有命名视图html。
是否可以在以下要求时加载命名视图?我的意思是,每当我们动态添加新标签时,才从服务器加载受尊重的视图html。
<tab ng-repeat="tab in tabs">
<div>
<div ui-view='{{tab.view}}'></div>
</div>
</tab>
Run Code Online (Sandbox Code Playgroud)
如果您希望根据中定义的用户可用标签的值从模板url动态加载标签内容$scope.tabs,则应考虑使用简单的指令而不是ui-router视图。
正如您已经发现的,ui-router将尝试加载子视图,无论是否在该状态的主视图中引用了它们。
但是,我们可以使用自己的指令来加载模板,因此,由于该指令仅在主视图中运行时才运行,因此模板可以按需加载。
template 指示:我们创建一个template指令,该指令允许我们将模板插入html元素中。
.directive('template', ['$compile', '$http', function($compile, $http) {
return {
restrict: 'A',
replace: false,
link: function($scope, element, attrs) {
var template = attrs['template'];
var controller = attrs['controller'];
if(template!==undefined){
// Load the template
$http.get(template).success(function(html){
// Set the template
var e = angular.element(controller === undefined || controller.length === 0 ? html : "<span ng-controller='" + controller + "'>" + html + "</span>");
var compiled = $compile(e);
element.html(e);
compiled($scope);
});
}
}
};
}]);
Run Code Online (Sandbox Code Playgroud)
因此,此代码使用该$http服务从服务器获取模板。然后,它使用该$compile服务将范围应用于角度模板,并将其渲染到目标元素中。
如下更新主选项卡模板的格式。请注意,我们不再引用ui-view,而是调用要在中加载的template指令。当前的内容正在作为加载指示器。urldivdiv
(如果controller设置了属性,则模板将被<span>具有ng-controller属性的包裹,因此可以应用模板控制器。这是可选的。)
home/shell:<tab ng-repeat="(tabName,tab) in tabs">
<div template='{{tab.template}}' controller="{{tab.controller}}">Loading {{tabName}} ...</div>
</tab>
Run Code Online (Sandbox Code Playgroud)
然后设置您要显示的选项卡:
<tab ng-repeat="(tabName,tab) in tabs">
<div template='{{tab.template}}' controller="{{tab.controller}}">Loading {{tabName}} ...</div>
</tab>
Run Code Online (Sandbox Code Playgroud)
这只是将上面给出的代码作为AngularJS应用示例。假设模板路径有效home/shell,home/tab1例如,等等。
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.15/angular-ui-router.js"></script>
<meta charset="utf-8">
<title>Angular Views</title>
</head>
<body ng-app="myTabbedApp">
<div ui-view></div>
<script>
angular.module('myTabbedApp', ['ui.router'])
/* Controller for the Main page ie. home/shell */
.controller('MainPageTabController', ['$scope', function($scope) {
// Set the page tabs dynamically as required by your code
$scope.tabs = {
'tab1': { template: 'home/tab1'},
'tab2': { template: 'home/tab2', controller: 'Tab2Controller' },
'tab3': { template: 'home/tab3'}
};
}])
/* Example controller for Tab 2 */
.controller('Tab2Controller', ['$scope', function($scope) {
$scope.hello = "world";
}])
/* State provider for ui router */
.config(['$stateProvider', function($stateProvider){
$stateProvider
.state("login",
{
url: "/login",
templateUrl: "login/index"
})
.state("main",
{
url: "/main",
templateUrl: 'home/shell',
controller: 'MainPageTabController'
});
}])
/* Directive to load templates dynamically */
.directive('template', ['$compile', '$http', function($compile, $http) {
return {
restrict: 'A',
replace: false,
link: function($scope, element, attrs) {
var template = attrs['template'];
if(template!==undefined){
// Load the template
$http.get(template).success(function(html){
// Set the template
var e = angular.element(html);
var compiled = $compile(e);
element.html(e);
compiled($scope);
});
}
}
};
}]);
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助。如果您对某事有疑问,请问。
| 归档时间: |
|
| 查看次数: |
1047 次 |
| 最近记录: |