Angular:ui-router如何通过状态将数据对象或某些参数传递给其他控制器

时间:2014-09-23 09:30:40

标签: angularjs angular-ui-router

我已经读过关于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'
    })

1 个答案:

答案 0 :(得分:1)

$stateParams仅保证为使用它们的目标路由保留。 ui-router实际上保持了这个对象的清洁,所以你不能随便把东西塞进去。

我很幸运使用服务作为管理器对象来在视图之间保留项目。例如,我有一个应用程序,它具有用户个人资料页面和照片库作为单独的视图。我想在画廊中有很多用户的核心数据,因为有一个标题带有他们的名字,链接回来,旁边有一个小的生物盒等等。

我连接它的方式,两个视图在其URL中都有一个用户ID作为参数。我有一个维护用户数据缓存的管理器,以及一个返回承诺返回它的getter。在这两种状态中,我都有一个resolve块,它接受用户ID并向管理器询问整个数据对象。管理员进行Web服务调用以便第一次获取数据,并立即解析第二次调用(无论谁先到达那里)。它工作得很好,而且重量很轻。

在您的示例中,您根本不需要URL中的参数,但模型可以以相同的方式工作。服务是全球单身人士,因此您可以将它们用作各种事物的倾倒场,并通过状态转换等方式持续存在。显然这是一个滑坡,因为有许多糟糕的编程实践,一旦你开始这样做也会启用 - 但是小心和良好的模式,这是一个非常有用的技术。

请注意,很多人实际上使用$rootScope来实现同样的目的 - 它具有基本相同的效果。但我个人认为服务更好,因为你有一个非常明确的,定义的包装器,你需要传递这些数据,它更可测试,并且更容易记录它。使用$rootScope,您只需将原始变量转储到一个巨大的堆中,它就会变成一堆意大利面,以便稍后分开,特别是如果您不小心重复使用变量名称。这会导致各种难以发现的错误。使用服务,您可以使用getter / setter,甚至可以将状态转换($state.go())调用连接到setter。