2014-11-07 13 views
7

Mã của tôi hoạt động trong Angular 1.2, nhưng không hoạt động ở 1.3 và tôi không thể tìm ra những gì đã thay đổi theo góc cạnh và những gì tôi nên thay đổi trong mã của mình để sửa lỗi.Điều gì đã thay đổi trong góc 1.3 đã phá vỡ mã của tôi?

Tôi đã thiết lập plunkr example.

Các mã trong HTML chỉ đơn giản là

{{ 'guy' | change }} 

Các mã javascript là:

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(); 
    } 
}); 

Ý tưởng là kết quả của bộ lọc phụ thuộc vào phản ứng async.

Trong góc 1,2, chế độ xem được cập nhật tương ứng. Trong Angular 1.3 nó không.

Để chuyển đổi giữa góc 1,2 và góc 1,3 - bạn cần thay đổi tuyến đường thành góc ở đầu tệp HTML. giữa

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

và điều này

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

Tôi cũng đã cố gắng 1.3.1 - cùng một vấn đề.

+1

Đây là phỏng đoán, nhưng '$ watch' trước đây có thể đã có trong toàn bộ cụm từ '' guy '| thay đổi' và bây giờ vì lý do hiệu quả chỉ là trên '' guy'', mà rõ ràng là không thay đổi. Tại sao bạn sử dụng một bộ lọc cho việc này? Bạn không thể chỉ làm '{{asyncData || 'guy'}} 'và sau đó dính vào bộ điều khiển của bạn' $ timeout (function() {$ scope.asyncData = 'newdata';}, 2000); ' – jdotjdot

Trả lời

6

Điều này là do tối ưu hóa được giới thiệu kể từ 1.3.0-rc2.

Về cơ bản, dịch vụ $parse thực hiện kiểm tra bẩn trên đầu vào và chỉ đánh giá lại biểu thức nếu ít nhất một trong các yếu tố đầu vào đã được thay đổi. Trong ví dụ của bạn, chữ 'guy', đầu vào duy nhất của biểu thức, không bao giờ bị thay đổi, vì vậy toàn bộ biểu thức bao gồm cả bộ lọc sẽ không được đánh giá lại. Hàm ý là các bộ lọc nên là không trạng thái, trả về cùng một kết quả cho cùng một đầu vào.

Giả sử bạn nhận thức được và chấp nhận hình phạt hiệu suất, bạn có thể bỏ qua tối ưu hóa này bằng cách nói rằng bạn đang AngularJS lọc stateful, như thế này:

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

Đây là mới plunkr mà làm việc như bạn mong chờ.

Các vấn đề liên quan