angularjs状态参数不起作用

时间:2016-01-20 13:49:50

标签: angularjs

我在尝试使用stage.go()将参数对象传递给某个状态时遇到问题。

这是我的州定义:

.state('drillhole.ddhinttype', {
        url: '/ddhinttype',
        templateUrl: VIRTUAL_DIR_PATH + '/App/Views/drillholemanager/drillhole/tabddhinttype.html?v=' + fileVer,
        controller: 'DrillHoleDdhIntTypeController',
        params: { name: null, description: null }
    })

这是我的控制器:

try {
    angular.module('centric.drillhole.manager');
} catch (e) {
    angular.module('centric.drillhole.manager', ['app.config', 'ui.router', 'kendo.directives', 'ui.bootstrap', 'ngCookies', 'centric.common', 'centric.notification', 'pascalprecht.translate', 'centric.security', 'centric.app.settings']);
}

angular.module('centric.drillhole.manager').controller('DrillHoleDdhIntTypeController', ['$scope', 'CentricUIHelper', 'NumberHelper', 'DrillHoleManagerService', 'app.config', '$stateParams',
function ($scope, uihelper, numberHelper, service, appconfig, $stateParams) {

    $scope.loading = false;

    $scope.isbusy = function () {
        return $scope.loading || $scope.$parent.loading;
    }

    var load = function () {
        var hello = $stateParams.name;
        var hello2 = $stateParams.description;

    };

    load();

}]);

我这样称呼州:

$state.go('drillhole.ddhinttype', { name: tab.params.name, description: tab.params.description });

在我的控制器中,名称和描述属性始终为空。

不确定我在这里缺少什么。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

如果你将params放在你的网址中,你就可以使用$stateParams

在控制器中访问它
.state('drillhole.ddhinttype', {
        url: '/ddhinttype/:name/:description',
        templateUrl: VIRTUAL_DIR_PATH + '/App/Views/drillholemanager/drillhole/tabddhinttype.html?v=' + fileVer,
        controller: 'DrillHoleDdhIntTypeController',
        params: { name: null, description: null }
    })

您可以在此处详细了解网址路由:https://github.com/angular-ui/ui-router/wiki/url-routing

答案 1 :(得分:0)

在状态定义中尝试此操作:

params: { name: undefined, description: undefined }

或者这个:

params: ['name', 'description']

答案 2 :(得分:0)

我觉得我应该发布最终结果。我已决定在URL中传递参数,以便我可以为多个选项卡重复使用相同的控制器,每个选项卡具有相同的功能,但是对于数据库中的不同表。

以下是我的基本控制器创建选项卡(CoreLogController.js)的部分:

   service.getDrillHoleIntervalTypes()
        .success(function (res) {
            $scope.data.drillHoleIntervalTypes = res;

            for (var i = 0; i < $scope.data.drillHoleIntervalTypes.length; i++) {
                // add the tab and set it as active if we're in the correct $state
                $scope.dynamictabs.push({ heading: $scope.data.drillHoleIntervalTypes[i].Name, route: 'drillhole.ddhinttype', params: { ddhinttype: $scope.data.drillHoleIntervalTypes[i].Name }, active: ($scope.$state.params.ddhinttype == $scope.data.drillHoleIntervalTypes[i].Name) });
            }
        })
        .error(function (error) {
            uihelper.showError(error);
        });

以下是显示标签的相关HTML部分(corelog.html):

        <tabset>
            <tab ng-repeat="t in statictabs" heading="{{t.heading}}" ui-sref="{{t.route}}" active="t.active"></tab>
            <tab ng-repeat="t in dynamictabs" heading="{{t.heading}}" ui-sref="drillhole.ddhinttype({ddhinttype: '{{t.params.ddhinttype}}'})" active="t.active"></tab>
        </tabset>

这是我定义状态(app.js)的地方:

    .state('drillhole.ddhinttype', {
        url: '/ddhinttype/{ddhinttype}',
        templateUrl: VIRTUAL_DIR_PATH + '/App/Views/drillholemanager/drillhole/tabddhinttype.html?v=' + fileVer,
        controller: 'DrillHoleDdhIntTypeController',
        params: { ddhinttype: null }
    })

我现在可以访问控制器的每个实例(DrillHoleDdhIntTypeController.js)上的ddhinttype变量,该变量告诉它对哪个表执行操作。

由于ddhinttype还包含URL,用户可以创建一个书签,即使它们是动态生成的,也会将它们带回到同一个标签页。