Angularjs ui路由器-具有共享控制器的嵌套视图
我有一个抽象的父视图,用于与嵌套视图共享控制器Angularjs ui路由器-具有共享控制器的嵌套视图,angularjs,angular-ui-router,Angularjs,Angular Ui Router,我有一个抽象的父视图,用于与嵌套视图共享控制器 .state('edit', { abstract: true, url: '/home/edit/:id', templateUrl: 'app/templates/editView.html', controller: 'editController' }) .state('edit.details', { url: '/details', templateUrl: 'app/templates/
.state('edit', {
abstract: true,
url: '/home/edit/:id',
templateUrl: 'app/templates/editView.html',
controller: 'editController'
})
.state('edit.details', {
url: '/details',
templateUrl: 'app/templates/editDetailsView.html'
})
.state('edit.info', {
url: '/info',
templateUrl: 'app/templates/editInfoView.html'
})
路由按预期工作
问题是,当我从一个嵌套视图更新$scope
变量时,该更改不会反映在视图中。当我从父视图执行同样的操作时,效果很好。这种情况不需要$apply
我的猜测是,正在为每个视图创建一个新的
editController
实例,但我不确定为什么或如何修复它。这里的问题与此问答相关:
解决方法隐藏在:
在AngularJS中,子作用域通常从其父作用域原型继承。在模型中使用“.”将确保原型继承发挥作用 我们甚至可以重用
控制器:'editController'
(我们不必这样做,因为$scope.Model将在那里-这要感谢继承)
现在,同一个控制器将被实例化多次(所有子控制器都是父控制器),但是$scope.Model
将只启动一次(在父控制器内部),并且在任何地方都可用
根据以下人员的评论检查此项
当使用
controllerAs
模式为子状态提供自己的控制器时,是否可以这样做
我决定附加另一个解决方案,使用controllerAs
,同时保留
有
这些状态现在将具有不同的控制器,父状态将其命名为“parentCtrl”(在具有子控制器的子作用域中不会被覆盖)
这些是控制器:
.controller('mainController', function ($scope) {
this.Model = {Name : "yyy"};
})
.controller('child1Controller', function ($scope) {
$scope.Model = $scope.parentCtrl.Model;
})
.controller('child2Controller', function ($scope) {
$scope.Model = $scope.parentCtrl.Model;
})
使用
resolve
.state('edit', {
abstract: true,
url: '/home/edit/:id',
templateUrl: 'app/templates/editView.html',
controller: 'editController',
resolve: {
baseData: function() {
return {};
}
}
})
.state('edit.details', {
url: '/details',
templateUrl: 'app/templates/editDetailsView.html',
controller: 'editController'
})
.state('edit.info', {
url: '/info',
templateUrl: 'app/templates/editInfoView.html',
controller: 'editController'
})
.controller('editController', function (baseData) {
baseData.foo = baseData.foo || 'bar';
});
在子控制器中,您可以执行以下操作:
angular.extend($scope, $scope.$parent)
let vm = angular.extend(this, $scope.$parent.vm);
如果控制器与别名一起使用,例如“vm”,您可以执行以下操作:
angular.extend($scope, $scope.$parent)
let vm = angular.extend(this, $scope.$parent.vm);
在Rails应用程序中如何处理这个问题?我有一个嵌套的控制器,带有主控制器和组织控制器。当我单独将一种样式应用于organizations视图时,一切正常,但应用于嵌套组织视图的另一种样式被非嵌套视图覆盖了。当使用controllerAs模式将子状态赋予其自己的控制器时,是否可以这样做?@PilotBob-希望这会给您带来感谢,这就是我所做的,将作用域注入子控制器以访问父模型。我原以为在视图中使用vm.$parent.model会更简单,但那不起作用。回答得很好!我确实认为在controller函数中仍然使用“$scope”参数有点令人困惑,因为将controller用作语法的想法是使用
this
而不是$scope。当然,据我所知,当您希望在控制器中使用监视程序时,仍然需要注入$scope(例如$scope.$watch('propName',function…)。
angular.extend($scope, $scope.$parent)
let vm = angular.extend(this, $scope.$parent.vm);