我在Ionic应用程序中调用控制器两次出现问题
这些是我的州
$stateProvider.state('connected', {
abstract: true,
url: '/{deviceId}',
template: '<ion-nav-view/>'
}).state('connected.presets', {
abstract: true,
url: '/presets/{presetType}',
template: '<ion-nav-view/>'
}).state('connected.presets.index', {
cache: false,
url: '/',
templateUrl: 'views/presets/index.html',
controller: 'PresetsIndexController'
});
我尝试在这样的状态之间导航
$state.go('.', {presetType: 'default'});
// OR
$state.go('.', {presetType: 'custom'});
我无法找到原因,只是通过更新PresetsIndexController
参数来调用presetType
两次。
我发现有人在这个问题上遇到了同样的问题http://plnkr.co/edit/znIa9XU9JsyUDjum2HHx?p=preview。要查看错误,请打开javascript控制台并单击重新加载图标,您应该在输出中看到hey
两次。
我也观看了$stateChangeStart
事件,但似乎被解雇了一次。
我已经显示了来自控制器的堆栈跟踪,而ion-nav-view
似乎是通话的根源。因此,根据我的尝试,似乎ion-nav-view
搞砸了所有事情,但不知道为什么以及如何解决这个......
编辑1
如果我将presetType
参数移动到最终状态,则控制器不会被调用两次。
.state('connected.presets', {
abstract: true,
url: '/presets',
template: '<ion-nav-view/>'
}).state('connected.presets.index', {
cache: false,
url: '/{presetType}',
templateUrl: 'views/presets/index.html',
controller: 'PresetsIndexController'
})
但这对我来说不是一个有效的解决方案,因为我有connected.presets
状态的其他孩子,我想继承presetType
。
编辑2
似乎问题来自stateParams在父状态上的更改。我的(糟糕的)解决方法是避免在父状态上更改stateParams ...
我不想更新ui-router lib,因为它与我的Ionic版本相关联。我认为其他开发人员也会遇到ui-router的问题,因为Ionic在v2及之后放弃了它。
我对这种解决方法不满意,但嘿,它正在工作。