2016-01-27 50 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); 
}