2016-03-15 19 views
7

Có lẽ đây là một sự hiểu lầm cơ bản về phạm vi Góc, nhưng ở đây đi.Bộ lọc góc không cập nhật khi thay đổi thuộc tính dịch vụ

Tôi có một dịch vụ để xử lý thay đổi một tuỳ chọn ngôn ngữ:

languageService.js

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

    var service = { 
    getLanguage: getLanguage, 
    setLanguage: setLanguage 

    }; 

    function getLanguage() { 
    return language; 
    } 

    function setLanguage (newLang) { 
    language = newLang; 
    } 

    return service; 
} 

Tôi cũng có một bộ lọc định dạng một cái gì đó:

someFilter.js

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

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

Tôi cố gắng sử dụng bộ lọc này trong một số HTML: Blah blah {{ 'test' | someFilter }}.

Nó hoạt động, nhưng chỉ khi tải; nếu tôi gọi setLanguage('en'), sự ràng buộc không thay đổi.

+1

Bạn cần phải trả lại 'dịch vụ' từ languageService.js. Ngoài ra, trong bộ lọc của bạn chắc chắn rằng bạn đang thực sự gọi phương thức getLanguage() khi bạn khai báo var french. –

+0

Vâng, xin lỗi, tôi đã cắt ra một số bản mẫu cho mục đích ngắn gọn. Tôi sẽ thêm nó vào. – opticon

Trả lời

6

Thực tế có hai vấn đề với mã của bạn.

Trước tiên, trong dịch vụ, bạn nên kích hoạt thông báo khi biến thể của bạn thay đổi. Vì vậy, nó sẽ là

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

Thứ hai và tinh tế hơn. Trong góc, bộ lọc chỉ được cập nhật nếu giá trị bạn vượt qua trong các thay đổi đánh dấu (trong trường hợp của bạn là 'kiểm tra'), cho bất kỳ thay đổi nào khác đối với phạm vi bộ lọc của bạn sẽ bị bỏ qua hoàn toàn.

Giải pháp là buộc góc để phân tích cú pháp bộ lọc cụ thể đó trên bất kỳ thông báo nào.

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

Bạn có thể nhận được thông tin thêm về các Angular Docs

+1

'bộ lọc. $ Stateful' đã thực hiện thủ thuật - nhiều hành động khác kích hoạt các chu kỳ tiêu hóa khi ngôn ngữ được thay đổi để bổ sung không cần thiết. Rực rỡ! – opticon

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