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);