如何在抽象状态模板中显示多个视图?
How do I show multiple views in an abstract state template?
使用 Angularjs UI-Router 我正在尝试构建一个带有主视图和侧面 refine/filter 结果视图的典型页面。
我已经分叉示例应用程序,现在将其修改为具有显示过滤器视图和主视图的父抽象状态,以便我可以共享抽象状态解析的数据。
问题是我无法在不破坏范围继承的情况下显示过滤器视图。如果我添加 'views' 参数,它会破坏范围,那么我怎样才能让它工作?
这是我的代码 Plunker
$stateProvider
.state('applications', {
abstract: true,
url: '/applications',
templateUrl: 'planning.html',
controller: function($scope){
$scope.planning = [{ id:0, name: "Alice" }, { id:1, name: "Bob" }];
$scope.filterPlanning = function(data) {
var output = $scope.planning;
// test filter
output = $filter('filter')({ name: "Alice" });
return output;
}
},
/* this breaks the scope from being inherited by the child views
views: {
'': {
templateUrl: 'applications.html'
},
'filters@applications': {
templateUrl: 'applications.filters.html'
}
},*/
onEnter: function(){
console.log("enter applications");
}
})
子状态:
.state('applications.list', {
url: '/list',
// loaded into ui-view of parent's template
templateUrl: 'planning.list.html',
onEnter: function(){
console.log("enter applications.list");
}
})
.state('applications.map', {
url: '/map',
// loaded into ui-view of parent's template
templateUrl: 'planning.map.html',
onEnter: function(){
console.log("enter applications.map");
}
})
applications.html
<div class="row">
<div class="span4">
<div ui-view="filters"></div>
</div>
<div class="span8">
<div ui-view></div>
</div>
</div>
我已经将列表、地图和过滤器视图构建为指令,所以我希望一旦我可以让这个演示工作,我就可以相对容易地交换它们。
我想说,这里的问题是:
Any controller
belongs to view
not to state
所以这是调整后的代码:
.state('applications', {
abstract: true,
url: '/applications',
// templateUrl and controller here are SKIPPED
// not used
// templateUrl: 'applications.html',
// controller: ...
views: {
'': {
templateUrl: 'applications.html',
controller: function($scope, $filter){
$scope.planning = [
{ id:0, name: "Alice" },
{ id:1, name: "Bob" }
];
$scope.filterPlanning = function(data) {
var output = $scope.planning;
// test filter
output = $filter('filter')({ name: "Alice" });
return output;
}
},
},
'filters@applications': {
templateUrl: 'applications.filters.html'
}
},
查看文档:
Views override state's template properties
If you define a views object, your state's templateUrl, template and templateProvider will be ignored. So in the case that you need a parent layout of these views, you can define an abstract state that contains a template, and a child state under the layout state that contains the 'views' object.
plunker to check它在行动
使用 Angularjs UI-Router 我正在尝试构建一个带有主视图和侧面 refine/filter 结果视图的典型页面。
我已经分叉示例应用程序,现在将其修改为具有显示过滤器视图和主视图的父抽象状态,以便我可以共享抽象状态解析的数据。
问题是我无法在不破坏范围继承的情况下显示过滤器视图。如果我添加 'views' 参数,它会破坏范围,那么我怎样才能让它工作?
这是我的代码 Plunker
$stateProvider
.state('applications', {
abstract: true,
url: '/applications',
templateUrl: 'planning.html',
controller: function($scope){
$scope.planning = [{ id:0, name: "Alice" }, { id:1, name: "Bob" }];
$scope.filterPlanning = function(data) {
var output = $scope.planning;
// test filter
output = $filter('filter')({ name: "Alice" });
return output;
}
},
/* this breaks the scope from being inherited by the child views
views: {
'': {
templateUrl: 'applications.html'
},
'filters@applications': {
templateUrl: 'applications.filters.html'
}
},*/
onEnter: function(){
console.log("enter applications");
}
})
子状态:
.state('applications.list', {
url: '/list',
// loaded into ui-view of parent's template
templateUrl: 'planning.list.html',
onEnter: function(){
console.log("enter applications.list");
}
})
.state('applications.map', {
url: '/map',
// loaded into ui-view of parent's template
templateUrl: 'planning.map.html',
onEnter: function(){
console.log("enter applications.map");
}
})
applications.html
<div class="row">
<div class="span4">
<div ui-view="filters"></div>
</div>
<div class="span8">
<div ui-view></div>
</div>
</div>
我已经将列表、地图和过滤器视图构建为指令,所以我希望一旦我可以让这个演示工作,我就可以相对容易地交换它们。
我想说,这里的问题是:
Any
controller
belongs toview
not to state
所以这是调整后的代码:
.state('applications', {
abstract: true,
url: '/applications',
// templateUrl and controller here are SKIPPED
// not used
// templateUrl: 'applications.html',
// controller: ...
views: {
'': {
templateUrl: 'applications.html',
controller: function($scope, $filter){
$scope.planning = [
{ id:0, name: "Alice" },
{ id:1, name: "Bob" }
];
$scope.filterPlanning = function(data) {
var output = $scope.planning;
// test filter
output = $filter('filter')({ name: "Alice" });
return output;
}
},
},
'filters@applications': {
templateUrl: 'applications.filters.html'
}
},
查看文档:
Views override state's template properties
If you define a views object, your state's templateUrl, template and templateProvider will be ignored. So in the case that you need a parent layout of these views, you can define an abstract state that contains a template, and a child state under the layout state that contains the 'views' object.
plunker to check它在行动