2016-01-27 51 views
1

我有一个pretty big question关于这个问题,但我认为它可能很容易将其拆分成较小的。

所以,我试图使用$控制器从ParentController继承,但事情没有按预期工作。

我有一个jsfiddle here。 这是代码。

angular 
    .module("app",[]) 
    .controller('ParentController', ParentController) 
    .controller('ChildController', ChildController) 

    ParentController.$inject = ['$scope'] 
    ChildController.$inject = ['$controller', '$scope']; 

function ParentController($scope) { 
    var vm = this;  

    vm.foo = 'parent foo'; 
} 

function ChildController($controller, $scope) { 

    $controller('ParentController as vm', {$scope: $scope}); 

     var vm = $scope.vm; // view model  
} 

和一个简单的HTML

<div> 
    {{vm.foo}} 
</div> 

当我配置应用程序来使用ParentController,与此

<body ng-app="app" ng-controller="ParentController as vm"> 

它工作正常。

但现在,它与ChildController不起作用,就像vm不包括在ParentController中创建的foo属性。

我在做什么错?

非常感谢。

回答

1

如果你真的想用这种方法,那么你需要扩展子控制器与父母控制器。您可以使用angular.extend此:

function ChildController($controller, $scope) { 
    angular.extend(this, $controller('ParentController', {$scope: $scope})); 
    this.bar = 'child bar'; 
} 

只要确保你第一次扩展子控制器实例对象(this)与父控制器实例后,才可以定义新的子属性。

演示:http://plnkr.co/edit/mdyCOUdZSLUV06AMnoZG?p=preview

+0

谢谢!这与瓦尔斯运作良好,但我试图创建一个新的功能,它不能正常工作。 [http://plnkr.co/edit/Cq6CB8srju5lbJhFDbFO?p=preview](http://plnkr.co/edit/Cq6CB8srju5lbJhFDbFO?p=preview) – David

+0

@david它也适用于方法。问题在于你使用了'var'来表示函数表达式,并且它们没有提升。如果你想在'vm.someValue = someValue;'赋值之后放置函数,你应该使用函数声明。 http://plnkr.co/edit/EhjWgbPSNQvfn68WvYul?p=preview – dfsq

+0

我的不好!非常感谢,这真的很有帮助。 – David

0

enter image description here

HTML

<div> 
    {{vm.foo}} 
</div> 

控制器

angular 
    .module("app",[]) 
    .controller('ParentController', ParentController) 
    .controller('ChildController', ChildController) 

    ParentController.$inject = ['$scope'] 
    ChildController.$inject = ['$controller', '$scope']; 

function ParentController($scope) { 
    var vm = this; 
    vm.obj={}; 
    vm.obj.foo = 'parent foo'; 
    console.log('parent',vm.obj); 
} 

function ChildController($controller, $scope) { 

    $controller('ParentController as vm', {$scope: $scope}); 

    var vm = vm; // view model  
    console.log("child",$scope.vm.obj); 
}