から削除されたときに再レンダリングを取得されていない、私は次のコードを持って、私のテンプレートで各-におけるキーは、コントローラ内のデータソース
export default Controller.extend({
session: service(),
cards: {},
init() {
this._super(...arguments);
const uid = this.get('session.data.authenticated.user.uid');
const databaseRef = firebase.database()
.ref(`cards/${uid}`);
const cards = this.get('cards');
databaseRef.on('child_added', data => {
const card = data.val();
this.set(`cards.${card.key}`, card);
});
databaseRef.on('child_changed', data => {
const card = data.val();
this.set(`cards.${card.key}`, card);
});
databaseRef.on('child_removed', data => {
const card = data.val();
const cards = this.get('cards');
delete cards[card.key];
this.set('cards', cards);
});
}
、
{{#each-in cards as |key card|}}
{{card-item
card=card
}}
{{/each-in}}
cards
オブジェクトに新しいカードが追加されたときに問題なく動作しています。しかし、delete this.get('cards')[card.key]
を使ってオブジェクトからカードを削除すると、リストは再描画されません。
私は、データソースが、child_removedイベントがトリガーされた後でカードの状態をログアウトすることによって変更されることを確認しました。
何か不足していますか?
更新
私はそれを作ることができ、それに深いクローンcards
オブジェクトを再割り当てして、テンプレートを再レンダリングしますが、全体のカードリストが再レンダリングを取得する必要があるため、それはかなり高価です。
databaseRef.on('child_removed', data => {
const card = data.val();
const cards = this.get('cards');
delete cards[card.key];
const cardsStr = JSON.stringify(cards);
this.set('cards', JSON.parse(cardsStr));
});
'cards'はプレーンなJSオブジェクトで、' notifyPropertyChange'という関数はありません。代わりにEmberオブジェクトとして最初に作成する必要がありますか? –
私は 'cards'を' new Ember.object() 'として作成してこの問題を解決しました。 –