如何在 JS 中直接调用控制器内的路由配置,而不是从 html 单击 href

How to call a route config inside a controller in JS directly rather than from html a href on-click

我在 AngularJS 中的路由和单页应用程序的概念上相对是一个新手。因此,我被困住了,非常感谢您帮助解决我的问题。

背景

我有一个“产品列表”页面,其中列出了 ng-repeat 循环中的所有产品。当我单击其中一个产品 link 时,应用程序通过 href 调用 [=16] 为该 'id' 加载“详细信息”页面(页面 'Products list' (SPA) 的扩展) =]

<a href="{{id}}/Details" class="button"> Details

为了启用到 'Details' 页面的路由,我们创建了一个 app.config 如下

in Productslist.js
-------

$routeProvider
    .when("/:id/Details",{ templateUrl : "../ProductsList/Details" , controller :})
    .otherwise({
        templateUrl : "/"
    }); 

目前的流程工作正常,当我在页面 'ProductsList' 上并单击 html 中的 'Details' 按钮时,我可以打开 'Details' 页面] 显示的任何产品。

如果相关,URL 显示ex: www.abc.com/list/4/Details 并且id = 4 的产品详细信息显示在页面上。

什么不起作用/我需要什么

现在,我想从另一个第三页“X”获取产品 ID,然后直接导航到产品详细信息页面(无需单击页面 A 中的“详细信息”按钮)。

由于此页面的模块最初是在“ProductsList”页面中创建的,因此我从页面 X 获取 'id' 值到 ProductList.js 并且我想设置 URL 如下打开 'Details' 页面。

if(fromPageX == 'true')
{
var x = id+"/Details";
location.href = x;   // dont wait on page productsList.html, but open "Details" page
}

基本上我想从 .js 文件中的控制器调用“路由”功能,而不是从 .html 文件(单击)

浏览器上的 URL 正确显示:www.abc.com/A/4/Details

但是我收到 404 - 页面未找到错误,因为它没有通过路由配置。 我尝试了 Window.location.href,或各种线程中的其他建议,但我仍然无法成功加载 'Details' 页面。

  1. 我正在寻找的这种情况在 AngularJS
  2. 中是否可行
  3. 我做错了什么。

在此先感谢您的支持!

不确定页面 X 的逻辑发生在哪里,但您至少有 2 个选择。您可以在页面 X 的路由的 resolve 中捕获它,或者您可以在页面 X 的控制器中捕获它。在解析中捕获它会更好,因为它不会首先尝试加载页面 X 控制器等.

解析方式。 在页面 X .js 文件中,添加一个解析块,该块将在路由解析之前捕获 ID 并重定向。

            $routeProvider
            .when("PAGE_X/:id",{ 
                templateUrl : "../ProductsList/PAGE_X" , 
                controller : 'pageXController',
                resolve: {
                    redirect: ['$q', '$location', '$routeParams' function($q, $location, $routeParams) {
                        var deferred = $q.defer();
                        if ($routeParams.id) {
                            $location.path("/A/"+ $routeParams.id + "/Details")
                            deferred.resolve();
                        } else deferred.resolve();
                        return deferred.promise;
                    }]
            }
            })
            .otherwise({
                templateUrl : "/"
            }); 

重定向方式 这将进入 PAGE_X 控制器,但不是 window.location 等,而是使用 angular $location (确保注入 $location 作为依赖项)方法 - https://docs.angularjs.org/guide/$location

if(fromPageX == 'true')
{
var x = "A/" + id+"/Details";
$location.path(x);
}