0

我只是想檢查這個功能是否可以在angularjs中使用。例如:我有一些常用函數的base指令,但是在我的整個應用程序中,所有的指令都需要實現這些函數,以便發生更多的代碼重複,我期待Java中的擴展(繼承)具有相同的功能。將基本指令功能擴展到其他指令

是否有可能在angularjs中實現此功能?

根據我的要求,我不能通過將此代碼移動到服務或工廠來存檔此功能,因爲它像應用程序中的所有指令都需要在鏈接上執行此操作,所以現在我所有的指令鏈接功能容器與重複代碼相同的功能。

我期待的是爲我的所有指令擴展基本指令功能。

[注意] 我的應用程序中的大多數指令都有獨立的範圍。

回答

1

答案主要在於JS域,尋找可重用代碼的模式是一個很好的挑戰。 Angular得到了extend,copymerge,但就這些,模塊和DI只是解決ES5限制的方法。

下面是關於如何從指令定義對象創建混合的提示。

app.directive('blockBase', function() { 
    return { 
     link: function (scope, element, attrs) { 
      scope.title = 'block'; 
     } 
    }; 
}); 

app.directive('brickBase', function() { 
    return { 
     restrict: 'E', 
     scope: true, 
     link: function (scope, element, attrs) { 
      // ... 
     } 
    }; 
}); 

app.directive('block', function (blockBaseDirective, brickBaseDirective) { 
    var blockDirective = angular.extend(brickBaseDirective[0], { 
     name: 'brick', 
     restrict: 'EA', 
     scope: { 
      title: '=' 
     } 
    }); 

    blockDirective.compile = function (element, attrs) { 
     // ... 
     return { 
      post: function (scope, element, attrs) { 
       blockBaseDirective[0].link(scope, element, attrs); 
       scope.title += ' offspring'; 
      } 
     }; 
    }; 

    return blockDirective; 
}); 

你應該自己決定,如果這種方法看起來比裝飾者更好。

在控制器/指令定義之外使用命名函數是擺脫重複代碼的流行方式,而不是優雅的代碼。當然,您可以通過自定義DDO屬性在指令之間共享函數或類。但是,工廠仍然更適合。

+0

你如何得到這個工作?當我嘗試這個時,我得到'未知的提供者'錯誤,似乎是當試圖注入一個指令到另一個指令時......這甚至可能嗎? – 2016-01-14 21:56:34

+1

@JaredHales是的,這是可能的,Angular寄存器的'directiveName'指令爲'directiveNameDirective'服務。它是否被注入到其他指令或其他地方並不重要。如果您在代碼方面有問題,請隨時發佈問題。 – estus 2016-01-14 22:52:45