Javascript AngularJS父控制器从子控制器返回时未调用
我有Javascript AngularJS父控制器从子控制器返回时未调用,javascript,jquery,angularjs,Javascript,Jquery,Angularjs,我有AngluarJS视图,其中列出了一些项目,用户可以通过单击每个项目来删除/更新它。当用户单击一个行项目时,我们将显示一个子视图。当用户对行项目执行一些删除/更新操作时,我正在使用state.go函数重新加载父视图 但我的父视图控制器未被调用(父控制器中的语句未被调用) 我使用了$urlRouterProvider来管理每个状态。 我将使用以下语句返回到父状态: $state.go('parent',{}, {reload: true}); 上面的操作正在触发我的配置代码段,并从服务器加载
AngluarJS
视图,其中列出了一些项目,用户可以通过单击每个项目来删除/更新它。当用户单击一个行项目时,我们将显示一个子视图
。当用户对行项目执行一些删除/更新操作时,我正在使用state.go
函数重新加载父视图
但我的父视图控制器未被调用(父控制器中的语句未被调用)
我使用了$urlRouterProvider
来管理每个状态。
我将使用以下语句返回到父状态:
$state.go('parent',{}, {reload: true});
上面的操作正在触发我的配置代码段,并从服务器加载新数据,下面是要加载父状态的配置中的代码段:
$stateProvider.state('parent', {
url : '/parent',
templateUrl : 'app/parent.html',
controller : 'ParentController',
controllerAs : 'parentController',
resolve : {
list : function($stateParams, parentServices){
return parentServices.getList();
}
}
});
parentServices.getList()
正在调用此函数。我已经在父控制器中为第一条语句设置了断点,但它没有被调用
重新加载页面时,其加载效果良好。请让我知道当前流有什么问题,它阻止调用控制器
更新:状态配置
如果导航到子状态,子控制器将
初始化,然后导航回父状态,父状态
控制器将不会被重新创建
谢谢。将项目列表放在Angular service中,然后您可以使用此服务访问父控制器和子控制器中的数据。让服务负责使用来自服务器的信息更新(确保您更新而不是替换)列表
然后,您可以在两个控制器中使用此信息,并且每个控制器对数据所做的任何操作都将对两个控制器可用,而无需重新初始化控制器(这在使用嵌套状态时不会发生在父控制器上)。,结构是Angular应用程序中最重要的部分,路由器在其中起着至关重要的作用
$stateProvider
.state("versions-layout", {
abstract: true,
url: "/versions/:id",
templateUrl: "js/versions/versions-layout.html",
controller: "VersionsController",
controllerAs: "versionsVm",
resolve: {
version: ["$stateParams", "VersionsService", function ($stateParams, VersionsService) {
return VersionsService.getVersionById($stateParams.id);
}]
},
})
.state('versions', {
parent: "versions-layout",
url: "",
views: {
"version-characteristics": {
templateUrl: 'js/versions/version-characteristics/version-characteristics.html',
controller: 'VersionCharacteristicsController',
controllerAs: 'vm'
},
"programs": {
templateUrl: 'js/versions/programs/programs.html',
controller: 'ProgramsController',
controllerAs: 'vm',
resolve: {
programsData: ["version", function (version) {
return version.data.programs;
}]
}
}
})
我可以通过对代码进行以下更改来解决问题:
我的子视图
在模式弹出窗口中
,因此要从子视图
返回到父视图
(重新加载数据),代码段编写如下:
$state.go(states.parent,{}, {reload: true});
closeChilUIPopover();// functionality to close the modal popup of child
closeChilUIPopover();
$state.go(states.parent,{}, {reload: true});
$state.go(states.parent,{}, {reload: true}).then(function(){
closeChilUIPopover();
});
当我注释掉closechiluipover()
函数时,新加载的数据可以很好地呈现父视图
于是我改变了通话顺序如下:
$state.go(states.parent,{}, {reload: true});
closeChilUIPopover();// functionality to close the modal popup of child
closeChilUIPopover();
$state.go(states.parent,{}, {reload: true});
$state.go(states.parent,{}, {reload: true}).then(function(){
closeChilUIPopover();
});
但在改变通话顺序后也出现了同样的问题。因此,我在
中添加了
函数,如下所示:
$state.go(states.parent,{}, {reload: true});
closeChilUIPopover();// functionality to close the modal popup of child
closeChilUIPopover();
$state.go(states.parent,{}, {reload: true});
$state.go(states.parent,{}, {reload: true}).then(function(){
closeChilUIPopover();
});
现在一切正常。
谢谢您的帮助。是的,我可以提供更多信息。所有项目都存储在数据库中。从我的服务中,我正在进行RESTAPI调用以执行CURD操作。子视图将使用服务更新数据库中的数据。所以在一些更新发生后,我想在父视图中重新呈现更新的数据信息。因此,我从子视图调用state.go('parent')。在某些情况下,用户可能会从子视图中删除项,因此我需要使用新的项列表(页面大小相同)重新加载父视图。如果使用
$state.go()
,导航到新状态,则在控制器初始化时加载列表项时,无需显式执行任何操作。控制器在后台不处于活动状态,它是在您更改为其使用状态时创建的。我能想象的唯一一次需要更新父控制器的情况是,父控制器是否在嵌套视图中有子控制器。即使这样,使用服务,两个视图都可以查看相同的列表并对其进行操作。我将使用state.go()
返回父视图。正如您所提到的,我正在为parent和view使用一个公共服务来获取更新的数据。现在有一个疑问,当我们进入之前所处的状态时,控制器是否会开始正确执行?在我的例子中,当我回到父视图时,控制器中的ant语句并没有执行。我观察到的是,如果您处于一种状态,并尝试使用$state.go()
导航到相同的状态,则不会发生任何事情。如果导航到子状态,则将初始化子控制器;如果随后导航回父状态,则不会重新创建父控制器。这很可能是你的问题的原因。