Ember 数据库新记录事件和观察者

Ember database new record event and observer

我的网络应用程序是使用 Ember.JS 和 Firebase 构建的,用于存储数据。它还充当移动应用程序的后端。用户可以使用移动应用程序发送 'help-request' - 该应用程序直接使用 Firebase 记录进行操作。进行更改后,Web 应用程序的管理员可以在屏幕上看到通知。那很好用。现在我想为此通知添加声音。

我解决它的一般想法是添加一个观察者,当将帮助请求类型的新记录添加到数据库时,该观察者将被触发。

我发现 post 解释了如何做,但它使用了像 ArrayControler 这样的不推荐使用的方法。

我在帮助请求模型中添加了一个简单的观察器,该模型在 property/ies 记录被修改时触发。这工作正常,但似乎是一个 hack 而不是真正的解决方案。

所以最大的问题是: 1.是否有任何回调、事件或通知我可以订阅以检查是否在 Firebase 中创建了新记录?如果是这样,我将如何订阅它?

import DS from 'ember-data';

export default DS.Model.extend({
    device: DS.attr('string'),
    userName: DS.attr('string'),
    locationName: DS.attr('string'),
    type: DS.attr('string'),
    fullNameChanged: function() {

      // deal with the change
      console.log("FULL NAME");
    }.observes('device').on('init')
});

我的第二种方法: Did Create - 当直接对 Firebase 进行更改时从不调用。

didCreate:function(){
  console.log("Created");
  var mySound = soundManager.createSound({
    url: 'assets/beep22.mp3'
  });
  mySound.play();
},

已更新 - 已调用但 属性 未保留

didUpdate:function(){
  console.log("Updated");
  console.log((this.get('shouldPlay')));
}

是否加载 - 似乎是最好的方法,但更改不会持久化:(

didLoad:function(){
  console.log("Did load");
   if(this.get('shouldPlay')){
     var mySound = soundManager.createSound({
     url: 'assets/beep22.mp3'
  });
  mySound.play();
  this.set('shouldPlay','false');
  this.save().then(() => {
      console.log("saved");
  },(error)=>{
      console.log(error);
  });

}

}

更新:

 this.set('shouldPlay','false'); 

应该

this.set('shouldPlay',false);

这就是它最终的工作方式。

当 firebase 将新记录添加到存储中时,它实际上是加载的而不是创建的。所以你可以在 ember model 上使用 didLoad 钩子。 我还建议创建服务来播放声音。这会让事情变得更容易。

// models/help-request.js
import DS from 'ember-data';
import Ember from 'ember';
const {inject: {service}} = Ember;

export default DS.Model.extend({
  soundPlayer: service(),

  didLoad() {
    this._super(...arguments);
    this.get('soundPlayer').newHelpRequest(this);
  },
});

// services/sound-player.js
import Ember from 'ember';

export default Ember.Service.extend({
  init() {
    this._super(...arguments);

    const beep = soundManager.createSound({
      url: 'assets/beep22.mp3',
    });
    this.set('beep', beep);
  }

  play(sound) {
    this.get(sound).play();
  },

  newHelpRequest(helpRequest) {
    if (!helpRequest.get('_didNotify')) {
      helpRequest.set('_didNotify', true);
      this.play('beep');
    }
  },
});