EmberJS + EmberFire: Как отобразить / скрыть модальные данные в зависимости от количества пользователей, вошедших на сайт

В настоящее время я использую EmberJS 2.6 и EmberFire для создания игры в реальном времени. Я хочу отобразить модальное сообщение "Ожидание противников", когда на сайте только один пользователь, и скрытое, когда их 2.

В настоящее время я могу добавлять пользователей в Firebase при доступе к сайту и удалять их при закрытии окна браузера. У меня проблема в том, что модал появляется, когда на сайте есть один пользователь, но не исчезает при подключении второго.

В целях отладки я попытался добавить {{isShowingModal}} в файл my-modal.hbs ниже. Если я открою веб-сайт на одной вкладке (то есть на одном пользователе), отобразится "true". Если я открываю веб-сайт на второй вкладке (то есть во втором пользователе), я вижу "true" и "false". Почему шаблон ember просто не обновляет значение свойства isShowingModal (вместо того, чтобы снова добавить его в представление)?

Любые идеи о том, как исправить эту проблему и показать модалы правильно? Смотрите мой код ниже. Спасибо!!!

// app / templates / index.hbs

{{#each users as |user index|}}
    {{my-modal userIndex=index}}
{{/each}}

{{outlet}}

// приложение / шаблоны / компоненты / my-modal.hbs

{{#if isShowingModal}}
    {{#modal-dialog close="closeModal"
                    translucentOverlay=true}}

        <div class="modal">
            <div id="waitingMessage">
                <h1>Waiting for Opponent</h1>
                <img src="assets/images/loading-icon.gif">
            </div>
        </div>
    {{/modal-dialog}}
{{/if}}

{{yield}}

// app / components / my-modal.js

import Ember from 'ember';

export default Ember.Component.extend({

    userArr: Ember.ArrayProxy.create({content: []}),
    isShowingModal: null,

    init() {
        this._super(...arguments);
        var self = this;

        this.get('userArr').pushObject(self.attrs.userIndex.value);

        if(this.get('userArr').content.length < 2) {
            this.set('isShowingModal', true);
        } else {
            this.set('isShowingModal', false);
        }

    },

    willDestroyElement() {
        this._super(...arguments);
        var self = this;

        this.get('userArr').popObject(self.attrs.userIndex.value);

        if(this.get('userArr').content.length < 2) {
            this.set('isShowingModal', true);
        }
    }

});

1 ответ

Решение

Причина того, что Ember добавляет showModal вместо обновления это происходит потому, что он находится внутри компонента, который находится внутри списка.

То, что я бы порекомендовал, это переместить код, чтобы показать / скрыть модальный компонент из компонента в контроллер. Как это:

//app/controllers/index.js
import Ember from 'ember';

export default Ember.Controller.extend({
  // Other code
  shouldShowModal: Ember.computed('users.[]', function() {
    if (this.get('users.length') < 2) { return false; }
    return true;
  })
})

тогда в вашем шаблоне

//app/templates/index.hbs
...
{{#if shouldShowModal}}
  ... code to show modal
{{/if}}
....

Таким образом, у вас есть доступ к длине списка пользователей, и вы можете контролировать показ мод на основе этого.

Другие вопросы по тегам