2016-03-15 21 views
7

おそらくこれはAngularスコープの基本的な誤解ですが、ここでは説明します。サービスプロパティが変更されたときに角度フィルタが更新されない

私は言語設定を変更処理するサービスがあります。

someFilter.js

:私も何かをフォーマットフィルタを持って

languageService.js

function languageService() { 
    var language = "en"; 

    var service = { 
    getLanguage: getLanguage, 
    setLanguage: setLanguage 

    }; 

    function getLanguage() { 
    return language; 
    } 

    function setLanguage (newLang) { 
    language = newLang; 
    } 

    return service; 
} 

function myFilter(languageService) { 
    return function(num) { 
    var french = languageService.getLanguage() === 'fr'; 

    if (french) { 
     return "is french!" 
    } else { 
     return "is other." 
    } 
    }  
} 

私はいくつかのHTMLでこのフィルタを使用しようとしています:Blah blah {{ 'test' | someFilter }}

ロード時のみ有効です。私がsetLanguage('en')と呼ぶと、バインディングは変わらない。

+1

の詳細情報を取得することができます。また、フィルタでは、実際には、french宣言時にgetLanguageメソッド()を呼び出すようにしてください。 –

+0

ええ、申し訳ありませんが、私は簡潔にするためにいくつかの定型文を切り出しました。 – opticon

答えて

6

コードには実際に2つの問題があります。

まず、サービスで、あなたのvarが変更されたときにダイジェストを起動する必要があります。だからそれはだろう

myApp.factory('languageService', ['$rootScope', function ($rootScope) { 
    var language = "en"; 

    var service = { 
    getLanguage: getLanguage, 
    setLanguage: setLanguage 

    }; 

    function getLanguage() { 
    return language; 
    } 

    function setLanguage (newLang) { 
    language = newLang; 
    $rootScope.digest(); 
    } 

    return service; 
}]); 

2番目以上の微妙なもの。角度では、フィルタはマークアップの変更(あなたの場合は 'test')で渡した値がスコープの変更に対して完全に無視される場合にのみ更新されます。

解決策は、任意のダイジェストでその特定のフィルタを解析するために角度を強制することです。

myApp.filter('someFilter', ['localeService', function (localeService) { 
    function filter (value) { 
    var french = languageService.getLanguage === 'fr'; 

    if (french) { 
     return "is french!" 
    } else { 
     return "is other." 
    } 
    } 

    filter.$stateful = true; // This line does the trick 

    return filter; 
}]); 

あなたはlanguageService.jsから「サービス」を返す必要がAngular Docs

+1

'filter。$ stateful'がトリックを行いました - 言語が変更されたときに追加が必要ないように、さまざまな他のアクションがダイジェストサイクルをトリガーします。ブリリアント! – opticon

関連する問題