angularjs - Angular Ui 路由器无法访问我的 Controller 内的 $stateParams

标签 angularjs angular-ui-router

我是 Angular.js 的初学者,我使用 Ui-router 框架进行路由。 我可以让它在 url 中没有参数的地方工作。但现在我正在尝试构建产品的详细 View ,我需要将产品 ID 传递到 url 中。

我是通过阅读教程并遵循所有方法来完成的。在本教程中,他们使用解析来获取数据,然后加载 Controller ,但我只需要直接将参数发送到 Controller 中,然后从那里获取数据。我的代码如下所示。当我尝试访问 Controller 内的 $stateParams 时,它是空的。我什至不确定 Controller 是否被调用。 代码如下所示。

(function(){
    "use strict";
    var app = angular.module("productManagement",
                            ["common.services","ui.router"]);
    app.config(["$stateProvider","$urlRouterProvider",function($stateProvider,$urlRouterProvider)
        {
            //default
            $urlRouterProvider.otherwise("/");

            $stateProvider
                //home
                .state("home",{
                    url:"/",
                    templateUrl:"app/welcome.html"
                })
                //products
                .state("productList",{
                    url:"/products",
                    templateUrl:"app/products/productListView.html",
                    controller:"ProductController as vm"
                })
                //Edit product
                .state('ProductEdit',{
                    url:"/products/edit/:productId",
                    templateUrl:"app/products/productEdit.html",
                    controller:"ProductEditController as vm"
                })
                //product details
                .state('ProductDetails',{
                    url:"/products/:productId",
                    templateUrl:"app/products/productDetailView.html",
                    Controller:"ProductDetailController as vm"
                })
        }]
    );
}());

这就是我的 app.js 的样子。我在最后一个状态 ProdcutDetails 上遇到了问题。

这是我的 ProductDetailController。

(function(){
    "use strict";
    angular
        .module("ProductManagement")
        .controller("ProductDetailController",
                    ["ProductResource",$stateParams,ProductDetailsController]);
        function ProductDetailsController(ProductResource,$stateParams)
        {
            var productId = $stateParams.productId;
            var ref = $this;
            ProductResource.get({productId: productId},function(data)
            {
                console.log(data);
            });
        }
}());

注意:我发现很多人都有同样的问题 https://github.com/angular-ui/ui-router/issues/136 ,我无法理解他们发布的解决方案,因为我正处于起步阶段。任何解释都会非常有帮助。

最佳答案

我创建了working plunker here

有状态配置

$urlRouterProvider.otherwise('/home');

// States
$stateProvider
    //home
    .state("home",{
        url:"/",
        templateUrl:"app/welcome.html"
    })
    //products
    .state("productList",{
        url:"/products",
        templateUrl:"app/products/productListView.html",
        controller:"ProductController as vm"
    })
    //Edit product
    .state('ProductEdit',{ 
        url:"/products/edit/:productId",
        templateUrl:"app/products/productEdit.html",
        controller:"ProductEditController as vm"
    })
    //product details
    .state('ProductDetails',{
        url:"/products/:productId",
        templateUrl:"app/products/productDetailView.html",
        controller:"ProductDetailController as vm"
    })

上面使用的功能有定义

.factory('ProductResource', function() {return {} ;})
.controller('ProductController', ['$scope', function($scope){
  $scope.Title = "Hello from list";
}])
.controller('ProductEditController', ['$scope', function($scope){
  $scope.Title = "Hello from edit";
}])
.run(['$rootScope', '$state', '$stateParams',
  function ($rootScope, $state, $stateParams) {
    $rootScope.$state = $state;
    $rootScope.$stateParams = $stateParams;
}])
.controller('ProductDetailController', ProductDetailsController)

function ProductDetailsController ($scope, ProductResource, $stateParams)
{
    $scope.Title = "Hello from detail";
    var productId = $stateParams.productId;
    //var ref = $this;
    console.log(productId);
    //ProductResource.get({productId: productId},function(data)    {    });
    return this;
}
ProductDetailsController.$inject = ['$scope', 'ProductResource', '$stateParams'];

检查一下here

但是你知道真正的问题是什么吗?事实上,只有一行字是麻烦制造者。检查原始状态def:

.state('ProductDetails',{
    ...
    Controller:"ProductDetailController as vm"
})

事实上,唯一重要的变化是

.state('ProductDetails',{
    ...
    controller:"ProductDetailController as vm"
})

controller 而不是 Controller(开头大写 C)

关于angularjs - Angular Ui 路由器无法访问我的 Controller 内的 $stateParams,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29363279/

相关文章:

javascript - 在自定义过滤器 Angular JS 中使用数字过滤器

angularjs - 我想从 ng repeat ui-route 中删除 td

javascript - 使用 Angular.js 从 json 文件获取数据时出现错误

javascript - ng-style 没有动态更新

Angular 路由器 : Redirect to an i18n URL

javascript - AngularJS 中具有嵌套状态的嵌套 View

javascript - Uncaught ReferenceError : $stateProvider is not defined Angular UI Router

javascript - 使用后退按钮时如何恢复 Angular Controller 中的过滤状态?

html - 如何使用 Angular.js 删除表中的特定行?

javascript - 将 Jasmine spyOn 与工厂中定义的对象的方法一起使用