2014-09-26 83 views
0

我有兩個指令:A和B.它們非常相似。我希望指令B繼承指令A中的控制器。繼承或共享指令控制器

換句話說,用於A的指令定義對象中的controller:的相同函數也需要是B的指令定義對象中使用的controller:函數。

除了複製/粘貼controller:函數,我如何在A和B的定義中使用相同的函數?

+0

該功能是否執行特定於視圖模型的某些內容,或者它是通用目的函數,如果是這樣的話,只需創建一個服務並在那裏添加該函數,然後在這兩個位置使用該服務。如何使用原型繼承來創建繼承的控制器,但是您是否希望繼承範圍或控制器實例上的函數? – PSL 2014-09-26 21:22:12

回答

0

如果我理解正確,你並不是真的想要繼承控制器。你想在兩個不同的指令中使用一個控制器。 如果是這種情況,只需聲明控制器函數,並將其作爲函數或字符串傳遞給兩個指令定義對象。

+0

沒錯。讓我澄清一下:兩個指令都在同一個模塊中,但在單獨的文件中聲明。我最終做的是將'controller'作爲一個工廠的函數公開,將這個factoring注入到兩個指令中,並將指令定義對象上的'controller'設置爲工廠實例中公開的函數。也許我應該使用服務?我仍然不清楚何時使用哪個。 – FOO 2014-09-26 22:10:46

+0

控制器只是一個功能,因此您並不需要服務/工廠。將控制器寫入單獨的文件中,並確保將其包含在您的網頁中。然後,只需將函數名稱傳遞給兩個指令的DDO即可。這樣,你只需重新使用一個函數。 – 2014-09-26 22:17:19

1

控制器都只是普通的JS功能,所以,你可以使用原型:

function BaseController(){ 
    this.commonFunct = function(){ 
     ... 
    } 
} 

function CtrlA(){ 
} 
CtrlA.prototype = BaseController 

function CtrlB(){ 
} 
CtrlB.prototype = BaseController 

這一點也適用controllerAs語法,當你的控制器會在一些名暴露範圍,說ctrl。然後$scope.ctrl.commonFunct(更通用的,可以從控制器的任何地方運行)或this.commonFunct(可以在控制器的實例方法中使用,其中this是控制器本身)可用於引用該功能。

如果您將一個模塊中的兩個控制器都聲明爲命名函數,那麼這起作用。如果他們在不同的模塊中聲明,你可以使用混入樣的方式與$controller

// Base module 
(function() { 
    'use strict'; 

    angular.module('Base', []); 

    function BaseController($scope, <injectables>, that) { 
    that.commonFunct = function() { 
    }; 
    } 

    angular.module('Base').controller('BaseController', 
    ['$scope', '...', BaseController]); 
})(); 

// Module that inherits functionality 
(function() { 
    'use strict'; 

    angular.module('Derived', ['Base']); 

    function DerivedController($scope, $controller, ...) { 
    $controller('BaseController', { 
     '$scope' : $scope, 
     ... 
     'that' : this 
    }); 

    // this.commonFunct is available 
    } 

    angular.module('Derived').controller('DerivedController', 
    ['$scope', '$controller', '...', DerivedController]); 
})(); 

MHO:我建議使用命名的函數宣告控制器/服務和指令,因爲它是更自然,這樣做的JS方法的東西。另外,我喜歡controllerAs語法,因爲它有助於區分直接存儲在作用域中的數據(如$scope.data)與控制器的方法(它們都存儲在一個作用域的命名對象中,如$scope.ctrl)。