【问题标题】:Passing additional parameters using $routeProvider使用 $routeProvider 传递附加参数
【发布时间】:2014-08-15 18:49:01
【问题描述】:

在我的 AngularJS 应用程序中,我有一个模板和一个控制器,我可以通过 2 个不同的 url 访问它们:

$routeProvider.when('/site/contents/:obj/:parent/:isnew?', {
    templateUrl: '/partials/site/data.html',
    resolve: {
        loggedin: checkLoggedin
    }
});

$routeProvider.when('/site/contents/new-obj', {
    templateUrl: '/partials/site/data.html',
    resolve: {
        loggedin: checkLoggedin
    }
});

第二条路由应该静态设置一个参数 isnew=1,就像我在 apache 中使用 RewriteRule 所做的那样,但是查看文档 https://docs.angularjs.org/api/ngRoute/provider/$routeProvider 似乎是不可能的。

有人遇到过同样的问题吗?

【问题讨论】:

    标签: angularjs angular-ui-router angularjs-routing


    【解决方案1】:

    如果您正在尝试这样做,您无法在 Angular 中真正设置默认路由参数。

    如果设置了$routeParams.isnew,最好的办法可能是检查你的控制器,如果没有,则默认为1。

    Angular 路由应该相当简单,而不是像 apache 中的 RewriteEngine 那样基于模式,所以逻辑应该在你的控制器中。

    您的控制器可能如下所示:

    function($routeParams) {
        $scope.isNew = ($routeParams.isnew || 1);
    }
    

    在您的情况下,您甚至可以不使用 isnew 参数。使用第一条路线修改现有对象,使用第二条路线创建它们(因此参数中 obj 的存在定义了它是否是新的)。

    【讨论】:

    • 嗯,这不是那么简单,因为即使在第一条路线中我也可以拥有 isnew != 1 这就是我使用该参数的原因。我目前删除了第二条路线,我只使用了一条将字符串“(空)”作为 obj 参数传递的路线,但这不是我所说的“干净”解决方案,因为我不喜欢有“规则”或约定在我的代码中。
    • 您的第一个路由是否习惯于创建一个与特定的objparent 关联的对象,而第二个创建一个与任何内容无关的对象?无论哪种方式,控制器中的逻辑仍然是可行的方法。
    • 当用户已经选择了我需要的所有参数时使用第一条路线,当用户尚未选择这些参数时使用第二条路线,他/她将直接在页面上进行(数据.html)。也许一个解决方案是检查 obj 是否为空,在这种情况下 isnew 将隐含地为真。同样,不是我所说的干净解决方案。
    • 最正确的解决方案是检查您的控制器是否已选择所述参数(所以,objparent?)。如果没有,这是一个全新的,他们需要输入它们。一两个条件不会真的让它“脏”。
    • 嗯,是的,它并不是真的“脏”,只是我想到了我使用重写引擎所做的事情。感谢您分享您的想法。
    猜你喜欢
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 2016-05-27
    • 2017-01-04
    • 1970-01-01
    相关资源
    最近更新 更多