2014-01-03 2 views
4

Есть ли способ повторно обработать фильтры AngularJS? Я пытаюсь использовать фильтр угловой валюты, который отображает символ валюты на основе загруженного языкового файла. Мне нужно повторно отобразить фильтры, когда я программно загружаю соответствующий языковой файл.Как отремонтировать угловые фильтры

ответ

0

Да. Для каждого выражения на вашем шаблоне существует установка $ watch. Фильтры являются частью этой оценки $ watch, поэтому вам просто нужно вызвать цикл дайджеста. После того, как вы загрузите свой языковой файл, обязательно вызовите $ scope. $ Apply(), который заново запустит все ваши часы и обновит ваш шаблон, если конечный результат любых часов изменится.

+0

Я бы предложил использовать функцию '$ timeout' вместо' $ scope. $ Apply'. –

+0

Можете ли вы уточнить, почему это было бы предпочтительнее? $ timeout просто отложит $ scope. $ apply(), пока поток рендеринга браузера не получит контроль. Это не кажется необходимым. – dtabuenc

+1

В некоторых случаях «$ scope. $ Apply» может вызвать ошибку TTL. Но переход на '$ timeout' не будет, так как он создаст новый цикл $ digest. Пожалуйста, поправьте меня, если я ошибаюсь. Спасибо –

0

Документация Developer Guide/Filters говорит:

В шаблонах, фильтры выполняются только тогда, когда их входы имеют изменились.

Таким образом, если мы хотим, чтобы фильтр был без гражданства, но реагируя на изменения какого-либо внешнего состояния, мы должны сделать это состояние входным для фильтра. Этот вход может быть чисто виртуальным, не имея никакого отношения к внутренней логике фильтра, только инициируя его выполнение.

Я недавно столкнулся с этой проблемой, выясняя, как динамически повторно отображать output.js на событие изменения локали. Это моя функция фильтра:

function FromNowFilter($moment) { 
    return function (value, langKey, omitSuffix) { 
     //langKey parameter is only used for triggering an update when language is changed 
     return $moment(value).fromNow(omitSuffix); 
    } 
} 
4

Из фильтров Angular 1.3 нет апатридов, что означает, что фильтры будут обновляться только тогда, когда их вход будет изменен.

Если вы хотите обновить фильтр, вам необходимо сделать фильтры $stateful.

app.filter('translate', translate); 

translate.$inject = ['$rootScope']; 

function translate($rootScope){ 

    filter.$stateful = true; 

    return filter; 

    function filter(str) { 
     return i18n[$rootScope.currentLang][str]; 
    }; 
} 

Фильтры будут выполняться на каждом $ digest, но это нецелесообразно по принципу.

Смежные вопросы