2016-09-18 3 views
1

Есть ли способ с EmberJS показать шаблон загрузки где-нибудь, когда что-то на моей странице что-то загружает?Ember js, show spinner, когда что-то загружается в фоновом режиме

Например, у меня есть страница с множеством исполнителей песен, и у каждого из них много песен. Я загружаю страницу художников, и хорошо, но в фоновом режиме я загружаю информацию о песнях всех. Мне просто нужен сканер для загрузки где-то, который говорит мне, что сайт загружает что-то (например, на вкладке «Сеть» в Chrome Developer Tools что-то ждет ...)

как это сделать в таком элегантный способ Emberjs?

ответ

1

Насколько я знаю (и основанный на быстром прочтении из API Docs) Ember не обеспечивает встроенный способ добиться этого. Если я ошибаюсь, это означает, что вам нужно будет выполнить отслеживание состояния запроса самостоятельно.

Вы можете сделать это в слое адаптера Ember (например, добавить код в app/adapters/application.js), но самым простым решением может быть просто работа с jQuery напрямую. Есть несколько API, вы можете использовать:

Я бы рекомендовал Создание Ember.Service для отслеживания этого state-- затем вы можете ввести его в любой контроллер или компонент, который должен отображать шаблон на основе этой информации. Ваша служба может выглядеть следующим образом:

import Ember from 'ember'; 

export default Ember.Service.extend({ 

    init() { 
    this._super(...arguments); 
    const invalidateRequestInProgress =() => { 
     this.notifyPropertyChange('dummyProperty'); 
    } 

    $(document).ajaxStart(invalidateRequestInProgress); 
    $(document).ajaxStop(invalidateRequestInProgress); 
    }, 

    requestInProgress: Ember.computed('dummyProperty', function() { 
    return Ember.$.active !== 0; 
    }), 

}); 

Я не проверял этот код, так что я не уверен, что это будет работать на практике :)

+0

Я пробую метод, который вы предлагаете, и он работает хорошо. Но можете ли вы лучше объяснить, что делает этот код? В частности, я бы понял, 'notifyPropertyChange' необходимо? Использовать 'Ember.computed' является доказательством производительности? 'return Ember. $. active! == 0;' что именно? У нас хорошая производительность? Что именно загружает загрузку Ember по умолчанию (https://guides.emberjs.com/v2.8.0/routing/load-and-error-substates /), так как при аякс-вызовах на сервер не загружается загрузка, и тогда нам приходится прибегать к этим ручным методам? –

+1

(1) 'notifyPropertyChange' сообщает Ember, что любые вычислимые свойства, которые полагаются на' 'dummyProperty'', должны быть пересчитаны. Это недействительность кэша. (2) Использование Ember.computed позволяет вам проверять 'requestInProgress' в вашем шаблоне. (3) 'Ember. $. Active! == 0;' - это то же самое, что '$ .active! == 0;', за исключением использования экземпляра jQuery, помещенного в ember, в случае, если на странице указано несколько $ s , Для того, что означает '$ .active', проверьте ссылку в моем ответе. –

+1

(4) «Загрузочная подстанция» в связанной вами статье активна только в ожидании обещания, возвращенного с помощью [крюка модели] (https://guides.emberjs.com/v2.8.0/routing/specifying-a -routes-model /) маршрута. У Эмбера нет возможности узнать о каких-либо произвольных призывах AJAX. –

2

Вы можете наблюдать isPending свойство Ember.PROMISEPROXYMIXIN так:

{{#if artist.songs.isPending}} 
    loading... 
{{/if}} 
+0

Я не понимаю, пожалуйста, вы можете объяснить больше? –

+0

Если мне нужна загрузка в состоянии приложения? Что-то, что появляется каждый раз, когда что-то во всем приложении загружается? –

+0

Вы можете создать шаблон загрузки на том же корневом уровне с помощью шаблона приложения. https://guides.emberjs.com/v2.8.0/routing/loading-and-error-substates/ –