我从角路线迁移到UI的路由器,我试着去弄清楚什么是构建最好的选择以下情形:角UI-路由器最佳实践:共享数据命名视图之间
我有一个由两个嵌套元素组成的通用面板同时显示:A FORM(呈现在左边)和一个简单的LIST(呈现在右边)。
的形式用于编辑,甚至在列表中创建一个新的项目(该操作是由throught服务使得AJAX调用)
的列表显示了所有项目,我可以选择一个他们并点击“编辑”,然后该项目转到窗体,我将能够操纵/更新它。
这里是我的代码:
.state('mt.demos', {
abstract: true,
url: '/demos',
views : {
'[email protected]' : {
templateUrl: '....demos.html'
}
}
})
.state('mt.panel', {
url: '',
views: {
'[email protected]': {
templateUrl: '...form.html',
controller : 'formController',
controllerAs : 'vm',
},
'[email protected]': {
templateUrl: '...list.html',
controller : 'listController',
controllerAs : 'vm',
}
}
})
到目前为止,我结束了与2种选择:
- 创建共享数据服务(这似乎是最容易被接受的答案,由于它的Singleton行为 - 但看看这篇文章末尾的注1
- 创建一个父控制器,这样每个嵌套状态就可以访问像列表或要编辑的项目这样的父属性。当我点击“编辑项目”时,listController会更新父级的范围,formController会随着这些数据而改变。
注1:当然要检索列表并更新项目,我已经使用了一个名为demoService的服务。此服务仅用于ajax请求。所以,如果最好的决定是上面显示的选项1,我相信我应该用一个新的提案创建一项新服务,对吗?或者在这个相同的服务中存储一些局部变量并不坏。 这个新服务将有列表和项目本身,所以当我点击编辑时,我会更新服务“项目”属性?
感谢您的快速响应! ;)新的“提案”只是指出我所有名为xxxService的文件都只用于与服务器通信。我从未使用这些文件来存储不同控制器之间的共享数据。所以回到问题中,我的服务名为demoService用于我的其他应用程序,共享数据(列表和项目)仅由listController和itemController使用。因此,其他将调用demoService的控制器将不会使用此共享数据(它们仅用于从服务器检索数据)。 – Germano
我认为它应该是不同的服务,然后,列表和项目在一个,而在另一个阿贾克斯。列表服务可以在需要获取数据时调用ajax服务。但是,从我个人的经验来看,将所有不同的ajax url存储在一个文件中并不是一个好主意,它会一直增长到有一天它没有意义。我发现保持各自的服务更清洁。 – Icycool
更新:我最终做了一项新的服务来分享数据并处理一些表单问题。感谢您的帮助 – Germano