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');
}
},
});
我的网络应用程序是使用 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');
}
},
});