AngularJS UR-Router重新加载/更改/恢复到先前状态& Param和Calls Parent两次/多次

时间:2014-09-29 19:11:42

标签: angularjs controller state reload angular-ui-router

我目前遇到ui-router的导航问题。请参阅下面的代码,以便我充分描述该问题:

// routeMap.js

...

.state('instance', {
    url: '/{instanceId}',
    templateUrl: '/Public/tmpl/index.html',
    controller: controllers.InstanceController
})
.state('instance.case', {
    url: '/case',
    templateUrl: '/Public/tmpl/views/case/case.html',
    controller: controllers.CaseController,
    data: {
        param1: 'p1'
    },
    onEnter: transitionEvents.enter,
    onExit: transitionEvents.exit
})
.state('instance.case.incident', {
    url: '/incident',
    templateUrl: '/Public/tmpl/views/case/partials/incident.html',
    controller: controllers.CaseIncidentController
})

...

$urlRouterProvider
    .when('', '/')
    .otherwise('/error/404');

// instance.js

function instanceController($scope, $rootScope, $state, $stateParams, $location, DTO) {
    $scope.instanceId = $stateParams.instanceId;

    $rootScope.$emit('instanceId', { instanceId: $scope.instanceId });

    console.log('@state | #instance', $stateParams, $scope, $state);

    $state.go('instance.case', $stateParams);
}


// case.js

function caseController($scope, $state, $stateParams, $location, DTO) {
    //var persisted = DTO.serialize(true)
    //    , options = angular.extend(options, persisted);

    // Inherit from CaseDataModel to $scope
    CaseDataModel.call($scope, options);
    DTO.observe($scope);

    console.log('@state | #hotline', $stateParams);

    $scope.networkUserId = 'SomeUserId';
    $scope.callDate = moment();

    setTimeout(function(){
        $scope.networkUserId = 'Brad Pitt';
        $scope.$apply();
    }, (1000 * 5));

    $state.go('instance.case.incident', $stateParams);
}

incidentController对路由没有任何作用)

期望的行为:

我想仅使用'instance'状态来管理基于案例ID(instanceId)的全局状态 - 从instance过渡到instance.case,以及过渡从那里(一旦调用案件控制器)到一个子状态(instance.case.incident) - 并且 - 能够从/new/case/incident导航到/998/case/incident,并且根据{{​​1}}保留所有正确的状态。

问题:

instanceId导航到/new/case/incident(反之亦然)时,/998/case/incident状态加载并转换为'instance' - 传递正确的'case'参数 - (到目前为止,这么好......),instanceId状态转换为'case'状态 - 继续传递正确'incident'参数的链 - (是的。 ..是...),instanceId状态加载(bravo!... Magnifico!...) - 然后,此过程再次出现,但是,传递 new 的旧'incident'参数 - 运行每个控制器,instanceId / onEnter等...(hogwash)。

然而:

onExit导航到/new/case/incident(反之亦然) - 没有/998/case子路径 - 'incident'状态转换为'instance' }状态和'case'状态转换为'case'状态而不会将旧/错误的参数传回的进程递归 - 这 是可取的。

我绝对搜索(全局)'incident'并且确实只有一个(ng-controller)函数在HTML中被引用。

Prethanks。

1 个答案:

答案 0 :(得分:0)

不知道你是否解决了这个问题,但我有一个类似的issue,它是通过不使用可选的大括号参数语法解决的。作为测试,我将可选的{parameter}移动到不同的状态,它们都开始解析两次。通过添加onEnter和onExit并记录到控制台,您可以看到它:解析,退出先前状态,加载当前状态,加载控制器,再次解析,退出当前状态,重新进入当前状态,以及加载控制器再次。所以看起来我们做了同样的事情。至少我知道在修复之前不要使用这种语法。如果你找到了另一种解决方案,我对此感兴趣,不幸的是我最终使用了可选的查询参数。

<强>更新

这是v0.2.11中的问题,显然已在v0.2.12中解决,请参阅answer 干杯