2014-11-07 2 views
7

Мой код работал в Angular 1.2, но не работает в 1.3, и я не могу понять, что изменилось в угловом и что я должен изменить в своем коде, чтобы исправить это.Что изменилось в угловом 1.3, что сломало мой код?

У меня есть plunkr example.

кода в HTML просто

{{ 'guy' | change }} 

Javascript код:

angular.module('app').service('MyService', function($timeout){ 

    var data = null; 

    $timeout(function(){ 
    data = 'this is data'; 
    },2000); 

    this.transform = function(){ 
    return data; 
    } 

}); 


angular.module('app').filter('change', function(MyService){ 
    return function(input){ 
    return MyService.transform(); 
    } 
}); 

Идея заключается в том, что результат фильтрации зависит от ответа асинхронного.

В Angular 1.2 вид обновлен соответствующим образом. В Угловом 1.3 это не так.

Для переключения между угловыми 1.2 и угловыми 1.3 - вам необходимо изменить маршрут на угловой в верхней части HTML-файла. между

<script data-require="[email protected]" data-semver="1.3.0" src="//code.angularjs.org/1.3.0/angular.js"></script> 

и это

<script data-require="[email protected]" data-semver="1.2.0" src="//code.angularjs.org/1.2.0/angular.js"></script> 

Я также попытался 1.3.1 - такой же вопрос.

+1

Это предположение, но '$ watch' может быть ранее на всем выражении' 'guy' | change', а теперь по соображениям эффективности только на «парня», который, очевидно, не меняется. Почему вы так часто используете фильтр? Разве вы не можете просто '{{asyncData || 'guy'}} ', а затем вставьте в контроллер' $ timeout (function() {$ scope.asyncData = 'newdata';}, 2000); ' – jdotjdot

ответ

6

Это связано с оптимизацией, введенной с версии 1.3.0-rc2.

В основном, служба $parse выполняет грязную проверку на входах и только переоценивает выражение, если хотя бы один из входов был изменен. В вашем примере буквальный «парень», единственный вход выражения, никогда не изменяется, поэтому полное выражение, включающее фильтр, не будет переоцениваться. Подразумевается, что фильтры должны быть неактивными, возвращая один и тот же результат для одного и того же ввода.

Предположим, вы знаете и согласны с потерей производительности, вы можете обойти эту оптимизацию, говоря AngularJS, которые вы фильтр с сохранением состояния, как это:

angular.module('app').filter('change', function(MyService){ 
    var fn = function(input) { 
    return MyService.transform(); 
    } 
    fn.$stateful = true; 
    return fn 
}); 

Это новый plunkr, который работает, как вы ожидал бы.

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