嵌套的 ng-controller 触发 $locationChangeStart?
nested ng-controller fires $locationChangeStart?
我有一些实现了 locationChangeStart
功能的父 Ctrl。我还有子控制器,它将数据从 html 绑定到父控制器
html:
<div> <!-- parent ctrl setted in routing -->
<div ng-controller="ChildCtrl as childCtrl"
ng-init="childCtrl.setObjectName('somename')">
<textarea name="name" ng-model="parentObject.name"></textarea>
</div> <!-- end of child -->
</div> <!-- end of parent-->
家长控制:
app.controller('ParentCtrl', function ($scope,$stateParams,config){
console.log("in parent");
$scope.timerPromise = null;
$scope.parentObject= {};
$scope.timerPromise = $interval(
function(){
},config.AUTOSAVE_TIMER_FREQUENCY);
console.log($scope.timerPromise);
$scope.$on('$locationChangeStart', function(event) {
if($scope.timerPromise) {
$interval.cancel($scope.timerPromise);
}
console.log("route changed in parent");
});
子Ctrl
app.controller('ChildCtrl', function ($scope, $rootScope, $stateParams) {
console.log('in child');
var vm = this;
vm.objectId = $stateParams.id;
vm.setObjectName = function(objectName) {
console.log('setting object name in commets+'+objectName);
vm.objectName = objectName;
};
});
我的问题如下 - 绑定 from/to 父 ctrl 变量没问题,我通过 ng-model 在子 ctrl 中看到来自服务器的数据,但在父 ctrl 中自动保存不起作用,因为 locationChangeStart 在之后触发加载父 ctrl 即使我不按后退按钮甚至没有按任何东西。位置更改事件停止计时器。 为什么即使我什么都没按,locationChangeStart 也会触发? 是因为嵌套控制器吗?我可以使用非别名,没有 ng-controller 标记,在路由父控制器和别名子控制器中一起设置吗?
我的控制台输出如下:
in parent
Promise {$$state: Object, $$intervalId: 160} // timer promise
in child
setting object name in commets+somename
route changed in parent
你看,路线改变了,我的问题是关于那个奇怪的行为
- locationChangeStart
来自旧的 ngRoute 现在我正在使用 ui-router 并且必须使用 stateChangeStart
事件。
我有一些实现了 locationChangeStart
功能的父 Ctrl。我还有子控制器,它将数据从 html 绑定到父控制器
html:
<div> <!-- parent ctrl setted in routing -->
<div ng-controller="ChildCtrl as childCtrl"
ng-init="childCtrl.setObjectName('somename')">
<textarea name="name" ng-model="parentObject.name"></textarea>
</div> <!-- end of child -->
</div> <!-- end of parent-->
家长控制:
app.controller('ParentCtrl', function ($scope,$stateParams,config){
console.log("in parent");
$scope.timerPromise = null;
$scope.parentObject= {};
$scope.timerPromise = $interval(
function(){
},config.AUTOSAVE_TIMER_FREQUENCY);
console.log($scope.timerPromise);
$scope.$on('$locationChangeStart', function(event) {
if($scope.timerPromise) {
$interval.cancel($scope.timerPromise);
}
console.log("route changed in parent");
});
子Ctrl
app.controller('ChildCtrl', function ($scope, $rootScope, $stateParams) {
console.log('in child');
var vm = this;
vm.objectId = $stateParams.id;
vm.setObjectName = function(objectName) {
console.log('setting object name in commets+'+objectName);
vm.objectName = objectName;
};
});
我的问题如下 - 绑定 from/to 父 ctrl 变量没问题,我通过 ng-model 在子 ctrl 中看到来自服务器的数据,但在父 ctrl 中自动保存不起作用,因为 locationChangeStart 在之后触发加载父 ctrl 即使我不按后退按钮甚至没有按任何东西。位置更改事件停止计时器。 为什么即使我什么都没按,locationChangeStart 也会触发? 是因为嵌套控制器吗?我可以使用非别名,没有 ng-controller 标记,在路由父控制器和别名子控制器中一起设置吗?
我的控制台输出如下:
in parent
Promise {$$state: Object, $$intervalId: 160} // timer promise
in child
setting object name in commets+somename
route changed in parent
你看,路线改变了,我的问题是关于那个奇怪的行为
- locationChangeStart
来自旧的 ngRoute 现在我正在使用 ui-router 并且必须使用 stateChangeStart
事件。