我已经读过关于ui-router的解析,数据,但仍然无法解决我的问题?
查看1 HTML:
<a ui-sref="configuration.settings.list"><span>Settings</span></a>
<a ui-sref="configuration.settings.personal({user: userId})"><span >Personal</span></a>
userId
是变量,它在控制器中为当前视图定义。
路线定义:
angular.module("app").config(["$stateProvider", "$urlRouterProvider", "$locationProvider",
function($stateProvider, $urlRouterProvider, $locationProvider) {
$stateProvider
.state('configuration.settings.lis', {
url: '/',
templateUrl: 'html/settings',
controller: 'settingsController',
}),
.state('configuration.settings.personal', {
url: '/:userId',
templateUrl: 'html/settings',
controller: 'personalController',
}),
我可以通过userId
访问personalController
中的stateParams
。
问题:我希望在没有`stateParams的情况下从View 1
传递对象或某些参数到personalController
。有可能吗?
类似的东西:
<a ui-sref="configuration.settings.personal({myDamnCooLObject})"><span >Personal</span></a>
.state('configuration.settings.personal', {
url: '/', <-- NO attributes here!!!
templateUrl: 'html/settings',
controller: 'personalController',
data: {{myDamnCooLObject}} <-- THIS object or parameter shuld be accesseble from 'personalController'
})
答案 0 :(得分:1)
$stateParams
仅保证为使用它们的目标路由保留。 ui-router实际上保持了这个对象的清洁,所以你不能随便把东西塞进去。
我很幸运使用服务作为管理器对象来在视图之间保留项目。例如,我有一个应用程序,它具有用户个人资料页面和照片库作为单独的视图。我想在画廊中有很多用户的核心数据,因为有一个标题带有他们的名字,链接回来,旁边有一个小的生物盒等等。
我连接它的方式,两个视图在其URL中都有一个用户ID作为参数。我有一个维护用户数据缓存的管理器,以及一个返回承诺返回它的getter。在这两种状态中,我都有一个resolve
块,它接受用户ID并向管理器询问整个数据对象。管理员进行Web服务调用以便第一次获取数据,并立即解析第二次调用(无论谁先到达那里)。它工作得很好,而且重量很轻。
在您的示例中,您根本不需要URL中的参数,但模型可以以相同的方式工作。服务是全球单身人士,因此您可以将它们用作各种事物的倾倒场,并通过状态转换等方式持续存在。显然这是一个滑坡,因为有许多糟糕的编程实践,一旦你开始这样做也会启用 - 但是小心和良好的模式,这是一个非常有用的技术。
请注意,很多人实际上使用$rootScope
来实现同样的目的 - 它具有基本相同的效果。但我个人认为服务更好,因为你有一个非常明确的,定义的包装器,你需要传递这些数据,它更可测试,并且更容易记录它。使用$rootScope
,您只需将原始变量转储到一个巨大的堆中,它就会变成一堆意大利面,以便稍后分开,特别是如果您不小心重复使用变量名称。这会导致各种难以发现的错误。使用服务,您可以使用getter / setter,甚至可以将状态转换($state.go()
)调用连接到setter。