私はangularjsから始めて、いくつかの古いJQueryプラグインをAngularディレクティブに変換する作業をしています。(要素)ディレクティブのデフォルトオプションのセットを定義したいのですが、属性にオプション値を指定することでオーバーライドできます。
私は他の人がこれを行った方法を見回してきました、angular-uiライブラリではui.bootstrap.paginationが同様のことをしているようです。
最初に、すべてのデフォルトオプションが定数オブジェクトで定義されます。
.constant('paginationConfig', {
itemsPerPage: 10,
boundaryLinks: false,
...
})
次に、getAttributeValue
ユーティリティ関数がディレクティブコントローラにアタッチされます。
this.getAttributeValue = function(attribute, defaultValue, interpolate) {
return (angular.isDefined(attribute) ?
(interpolate ? $interpolate(attribute)($scope.$parent) :
$scope.$parent.$eval(attribute)) : defaultValue);
};
最後に、これはリンク関数で属性を読み込むために使用されます。
.directive('pagination', ['$parse', 'paginationConfig', function($parse, config) {
...
controller: 'PaginationController',
link: function(scope, element, attrs, paginationCtrl) {
var boundaryLinks = paginationCtrl.getAttributeValue(attrs.boundaryLinks, config.boundaryLinks);
var firstText = paginationCtrl.getAttributeValue(attrs.firstText, config.firstText, true);
...
}
});
これは、デフォルト値のセットを置き換える必要があるため、標準としてはかなり複雑な設定のようです。これを行う一般的な方法は他にありますか?または、常にgetAttributeValue
このようなユーティリティ関数や解析オプションを定義するのは正常ですか?この共通のタスクに対して人々がどのような戦略を持っているかを知りたいです。
また、おまけとして、なぜこのinterpolate
パラメーターが必要なのかはわかりません。
ui.bootstrap.pagination
物事がより複雑な方法で行われるのかについての考えはありますか?コンパイル機能を使用する場合、後で行われた属性の変更は反映されないだろうと考えていましたが、この段階ではデフォルトのみが設定されているため、これは正しくないようです。ここでいくつかのトレードオフが行われているはずだと思います。