处理灵活的参数量

时间:2014-11-26 18:08:33

标签: javascript arrays angularjs angular-ui-router

我的代码中有这句话:

.state('category', {
    url: '/categories/:parameter',
    templateUrl: 'templates/common/categories.html',
    controller: 'categoriesCtrl',
    resolve : {
    categoryList: ['Products', function (Products) {
        return Products.listByCategories($stateParams.parameter);
    }]
    }
})

它只是一个简单的网上商店,你知道......根据类别列出产品。问题是类别的数量必须是动态的...我可以,例如请求:

/categories/shoes
/categories/shoes/man/
/categories/shoes/man/running
/categories/shoes/man/running/nike

因此,参数必须是动态的,我不知道如何做到这一点。谁能帮我?谢谢!

2 个答案:

答案 0 :(得分:1)

我认为你有两种选择:

选项1(我不建议使用,但这是一个选项):

$stateProvider.state('category', {
    // All patterns may be changed, just remember to keep the {0, x} the 0 is important to allow // emptiness between slashes.
    url: '/categories/{item:[a-z0-9\-]{0,8}}/{gender:[a-z]{0,6}}/{sport:[a-z]{0,12}}/{company:[a-z0-9]{0,8}}',
    controller: function($stateParams) {
        console.log($stateParams);
    }
});

您将可以使用:

  • /categories/shoes///
  • /categories/shoes/man//
  • /categories/shoes/man/running/
  • /categories/shoes/man/running/nike

选项2(我喜欢):

$stateProvider.state('category', {
    // Pattern can be changed except the \/
    url: '/categories/{details:[a-z0-9\/\-]{0,20}}',
    controller: function($stateParams) {
        console.log($stateParams);
    }
});

现在,您可以使用任何组合,只要它以/categories/开头:

  • /categories/shoes/man/running/nike

现在你只需要使用split()方法然后决定:

  1. 键0将包含项目。
  2. 键1将包含性别。
  3. 如果您或客户输入性别而不是项目,您可以key 0items whitelist(array with items)进行检查,享受。

答案 1 :(得分:0)

通常,我已经看到这样做的方法是将类别与' - '或者' +'而不是斜杠,因为它们不是目录,并且还会混淆大多数url路由器(在这种情况下为angular)。 您还可以查看匹配整个URL并自行解析斜杠,但如果您使用' - '或' +'您可以将整个目录解析为字符串,然后根据分隔符分隔以获取要搜索的类别列表。