2017-08-17 7 views
0

私はAngularJsアプリで作業を始めました。 index.jsでは、一連のmoment.js関数が$rootScopeにエクスポートされます。 著者は、これらの関数をHTMLファイルからアクセス可能にするためにこれを行いました。例えば、

RSApp.run(function ($rootScope) { 
    $rootScope.toTime = function (date)  { return moment(date).format('HH:mm:ss'); }; 
    $rootScope.toCalendar = function (date) { return moment(date).calendar(); }; 
    $rootScope.fromNow = function (date) { return moment(date).fromNow(); }; 
    ... 

の代わりに、このような$rootScopeを汚染、私は単にmoment自身をさらすことを考えて、とHTML内の特定のmoment.js関数を呼び出しています。

RSApp.run(function ($rootScope) { 
    $rootScope.moment = moment; 

私の質問は、この考えられて良い練習のように$rootScopeからmomentを暴露されていますか?

答えて

3

いいえ、そうではありません。実際、それは非常に悪い習慣です。機能を公開するより良い方法は、servicesfactoriesです。

問題は、スコープは双方向データバインディングのためのダーティーチェックの一部です。スコープに属していないものを追加すると、分解サイクル中にangularjsをチェックする余分なゴミだけになります。あなたはこのようなものを使用することができます

:また

angular.module('myMod') 
    .factory('dateUtil', function() { 
    return { 
     toTime: function(date) {  
     return moment(date).format('HH:mm:ss');  
     }, 
     toCalendar: function(date) {  
     return moment(date).calendar();  
     }, 
     fromNow: function(date) {  
     return 
     moment(date).fromNow();  
     } 
    }; 
    }); 

をビューでこれらのヘルパーを使用しようとしている場合、あなたはangulajsフィルタを使用する必要があり、最初の場所で$rootScopeでそれを公開したいです、あなたの意見に{{ new Date() | toTime }}のようなことをすることができるでしょう。例えば

angular.module('myMod') 
    .filter('toTime', function() { 
    return function(date) {  
     return moment(date).format('HH:mm:ss');  
    }; 
    }); 

注:それはangularjs方法で既に使用されるサービスとフィルタを持っている、それは便利かもしれないangular-momentをチェックアウトすることを検討してください。

2

モーメントmodule.constant serviceを作成することによって注射することができる。

RSApp.constant("moment", moment); 

必要どこそれを注入:

RSApp.controller("myCtrl", function($scope, moment) { 
    //code here 
}); 

$rootScopeが存在し、それは悪

のために使用することができます

AngularJSのスコープは階層を形成します、prototypicaツリーの上部にあるルートスコープを継承しています。通常、これは無視されます。ほとんどのビューにはコントローラがあり、したがってスコープは独自のものです。

場合によっては、アプリ全体にグローバルにしたいデータがあります。これらの場合は、$rootScopeを注入し、他のスコープと同様に値を設定することができます。スコープはルートスコープから継承されるため、ng-showのようなディレクティブにアタッチされた式では、ローカルの$scopeの値と同じように、これらの値を使用できます。

もちろん、グローバルな状態が悪いので、任意の言語でグローバル変数を使用するように、控えめに$rootScopeを使用してください。特に、データのみをコードに使用しないでください。$rootScopeに関数を入れようとしているのであれば、必要な場所に注入してより簡単にテストできるサービスに入れておく方が良いでしょう。

逆に、人生の唯一の目的は、データのビットを格納して返すことであるサービスを作成しないでください。

— AngularJS FAQ - $rootScope exists, but it can be used for evil

関連する問題