这是我的app.js文件 - 我有一个父州和两个子州。 两个子视图都需要该对象。
states.push({
name: 'parentstate',
url: '/parent/:objId',
abstract: true,
templateUrl: 'views/parentview.html',
controller: function() {},
resolve: {
obj: function(OBJ, $stateParams) {
return OBJ.get($stateParams.objId);
}
}
});
我想用这个已解决的obj来决定子模板
states.push({
name: 'parentstate.childs',
url: '/edit',
views: {
"view1@parentstate": {
templateUrl: 'views/view1',
controller: 'view1Ctrl'
},
"view2@parentstate": {
templateUrl: function(obj) {
if (obj.something == something) {
return "views/view2first.html";
} else {
return 'views/view2second.html';
}
},
controller: 'view2Ctrl'
}
}
});
我怎样才能实现这个目标?
答案 0 :(得分:8)
有一个有效的example。我们应该使用templateUrl
而不是templateProvider
。这是新的状态def:
$stateProvider
.state('parentstate.childs', {
url: '/edit',
views: {
"view1@parentstate": {
templateUrl: 'views.view1.html',
controller: 'view1Ctrl',
},
"view2@parentstate": {
templateProvider: function($http, $stateParams, OBJ) {
var obj = OBJ.get($stateParams.objId);
var templateName = obj.id == 1
? "views.view2.html"
: "views.view2.second.html"
;
return $http
.get(templateName)
.then(function(tpl){
return tpl.data;
});
},
controller: 'view2Ctrl',
}
}
});
为什么我们使用这种方法?如此处所述:
<强> TemplateUrl 强>
...templateUrl
也可以是返回网址的函数。 需要一个预设参数stateParams
,它不会被注入。<强> TemplateProvider 强>
或者您可以使用模板提供程序功能,可以注入,可以访问本地,并且必须返回模板HTML,如下所示:
在此工作plunker
中查看基于TemplateProvider
的解决方案