我的网络应用程序是使用Ember.JS和Firebase构建的,用于存储数据。它还可以作为移动应用的后端。用户可以使用移动应用程序发送“帮助请求” - 应用程序直接使用Firebase记录进行操作。当进行更改时,管理员的Web应用程序可以在屏幕上看到通知。这很好。现在我想为此通知添加声音。
我的一般想法是解决它以添加一个观察者,当一个新的帮助请求类型记录被添加到数据库时将被触发。
我找到了post种解释如何做到这一点,但是它使用了像ArrayControler这样的弃用方法。
我添加了一个简单的观察者来帮助请求在修改记录的属性时触发的模型。这很好,但似乎是一个黑客而不是一个真正的解决方案。
所以最大的问题是: 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')
});
我的第二种方法: 创建 - 直接对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);
这就是它最终的运作方式。
答案 0 :(得分:1)
当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');
}
},
});