在父控制器$ onInit()中,我正在等待解析设置页面标题的承诺,并获得具有自己的控制器的列表的opid。 这是来自父控制器:
public $onInit = () => {
this.swSubviewInfo.resolved.then((response: IDashboardResponseData) => {
this.setGroupId(response.opid);
this.updateTitle(response.objectName);
});
}
我想使用状态提供程序等待父解析$ onInit,因为在子控制器的初始化中需要正确的opid。某人能举例说明怎么做吗? 下面是子控制器的配置文件。
const state: IStateProvider = {
controller: "groupMembersSubviewListController",
controllerAs: "vm",
template: require<string>("./groupMembersSubviewList.html"),
resolve: {
parent: ???
}
};
答案 0 :(得分:0)
你可能不应该加载$ onInit中的东西。如果您在$ onInit中,那么等待承诺已经“迟到”。
从你的例子中我假设你正在使用angularjs的ui-router。在那里你有可能在一个州解决(就像你已经尝试过父母一样)。
如果您需要在状态实际运行之前加载promises,我建议通过resolve解决状态加载它(请记住,您的页面将等待渲染,直到所有内容都得到解决,因此请保持这样快/短可能的)
然后从父级声明第二个状态为子状态。这样第二个状态只会被加载,直到完成第一个状态(在默认情况下激活的较新版本中)。
简化版可能与此类似:
.state('parent', {
templateUrl: 'file.html',
controller: 'ParentController',
url: '/url',
resolve: {
swSubviewInfo: () => {
// do your loading stuff. Make sure to return a promise
}
},
})
.state('parent.child', {
templateUrl: 'file2.html',
controller: 'ChildController',
url: '/child',
})
另外值得一提的是,父级解析现在可以在子控制器中作为绑定访问,因此您可以使用“swSubviewInfo”访问它
答案 1 :(得分:0)
这是设计问题。 MV *范例中控制器/视图模型的目的是将模型绑定到视图,它应该只包含表示逻辑。
在其他地方需要父控制器中列出的逻辑这一事实表明控制器包含不属于那里的业务逻辑(所谓的“胖控制器”问题)。
应将 swSubviewInfo
移至服务和/或解析程序。由于解析器解析为promise值,因此从它返回一个promise:
resolve: {
parent: (/* any service swSubviewInfo comes from */) => swSubviewInfo.resolved
}