angularjs锻炼任何州的参数

时间:2014-12-15 16:57:17

标签: angularjs angular-ui-router

我试图列出stateprovider中存在的所有URL(angularjs 1.2.26)。

给出下面的例子,(非常简化状态列表):

angular.module('app')
.config(function ($stateProvider) {

    $stateProvider
        .state('app.vendors', {
            url: '/vendors',
            templateUrl: 'app/vendor/list.html',
            controller: 'Vendor.ListController as vm',
        })
        .state('app.vendor', {
            url: '/vendor/{vendorId}',
            templateUrl: 'app/vendor/details.html',
            controller: 'Vendor.DetailsController as vm',
            data: {
                subnav: [
                    { title: 'Details', icon: 'fa-align-left', state: 'app.vendor', permissions: 'get-vendor', exactStateOnly: true },
                    { title: 'Sites', icon: 'fa-archive', state: 'app.vendor.sites', permissions: 'get-site' },
                    { title: 'NCRs', icon: 'fa-copy', state: 'app.vendor.ncrs', permissions: 'get-vendor' }
                ],
                requiredPermissions: ['get-vendor']
            }
        })
        .state('app.vendor.sites', {
            url: '/sites',
            templateUrl: 'app/vendor/site/list.html',
            controller: 'Vendor.Site.ListController as vm',
            data: {
                requiredPermissions: ['get-site']
            }
        })
        .state('app.vendor.site', {
            url: '/site/{siteId}',
            templateUrl: 'app/vendor/site/details.html',
            controller: 'Vendor.Site.DetailsController as vm',
            data: {
                requiredPermissions: ['get-site']
            }
        })
        .state('app.vendor.ncrs', {
            url: '/ncrs',
            templateUrl: 'app/vendor/ncr/ncrList.html',
            controller: 'Vendor.NCR.NCRListController as vm',
            data: {
                requiredPermissions: ['get-vendor']
            }
        });
});

访问特定供应商,您将使用州:

app.vendor({vendorId: 1})

访问其网站

app.vendor.site({vendorId: 1, siteId: 2})

如果我将$ state对象传递给控制器​​,我可以使用state.get()列出所有状态。

如果我列出它们,则网址只包含最后一部分(即配置中的内容,以及相对于其父节点的内容)。我可以使用$ state.href(' app.vendor.site')这将给我几乎整个网址,但是错过了参数。我试图在运行时找到一种方法来知道它需要什么或至少有多少参数。

我的目标是尝试为我们的Angular应用程序中的每个页面创建一个基本的冒烟测试,以确保它加载某些内容并且不会在控制台中出错。我不想手动维护带有参数的网址列表。 (我们所有的参数都是int ID所以我可以简单地使用" 1"在参数中测试网址。)

1 个答案:

答案 0 :(得分:2)

州的私有部分包含paramsownParams个对象。您可以使用装饰器来访问这些内部变量。请参阅我之前关于使用装饰器公开整个内部状态对象的答案:UI-Router $state.$current wrapper for arbitary state

装饰州对象后,使用$$state()功能检索私有部分。然后查询状态以获取其参数并生成href。

angular.forEach($state.get(), function(state) {
  var paramKeys = state.$$state().params.$$keys();
  var fakeStateParams = {};
  angular.forEach(paramKeys, function(key) { fakeStateParams[key] = key; });

  console.log($state.href(state, fakeStateParams));
});