2016-03-08 62 views
2

我使用this.store.push推記錄進店從應用控制器(這個動作被從在應用控制器初始化一個Socket服務調用)更新模板,使用燼2.2.1我實現這個像Push記錄到本地存儲和

var newStoreRecord = this.store.push({ 
    data: { 
     id: id, 
     type: 'cart', 
     attributes: newCartItem 
    } 
}); 

這增加了這個新項目進店,但模板沒有更新以顯示新的項目,我也嘗試添加像這樣

this.get('cart.model').pushObject(newStoreRecord);假設我有一些東西如控制器頂部的cart: Ember.inject.controller(),,可能無論如何,都有這個錯誤。

在車路線我有我的模式被定義爲這樣

model(params) { 
    this.set('routeParams',params.event_url); 
    return Ember.RSVP.hash({ 
     event: null, 
     items: null 
    }); 
}, 
actions: { 
    didTransition() { 
    this.store.findRecord('event',this.get('routeParams')).then((result)=>{ 
     this.controller.set('model.event',result); 
    }); 
    this.controller.set('noItems',false); 
    this.store.query('cart',{auction_id:this.get('routeParams'),user:this.get('user.user.user_id'),combine:true}).then((result)=>{ 
     if(!result.get('length')){ 
     this.controller.set('noItems',true); 
     return null; 
     }else{ 
     this.controller.set('model.items',result); 
    } 
    }); 
    }, 
} 

不知道如果我在與獲得的模板更新,因爲我沒有使用模型掛鉤的煩惱? (順便說一句,我們沒有使用模型掛鉤,因爲Android上的糟糕表現,我們寧願加載一個空模板與裝載機,然後加載數據,而不是周圍的其他方式

+0

您可以將您的模板代碼?另外,你在哪裏做'push()'?我也沒有看到。 – mattmcmanus

回答

1

我這裏有幾個想法:

具體回答你的問題,當你從商店設置一個變量,像你這樣做,只會參考什麼是在商店當時,它不會自動更新。

最好的辦法是兩個新的計算屬性添加到您的控制器:

items: Ember.computed(function() { 
    return this.store.peekAll('cart'); 
}), 

// You'll need to flesh this one out further 
filteredItems: Ember.computed('[email protected]_id', function() { 
    return this.get('items').filter(...); 
}) 

參考filteredItems在你的模板,它應該工作。

旁註,我會強烈建議重構有兩件事情。

  • 我會用setupController掛鉤,而不是didTransition。它運行模式鉤齊全所以你正在尋找
  • 您可以access the params在路線的任何時間將類似於後,這樣你就不會需要將其儲存在模型中勾
  • 你不如果你沒有做任何異步數據,就不需要在模型鉤子中返回一個承諾。只需返回對象。你甚至需要這樣做。

希望這會有所幫助。

+0

那麼我想在你的代碼中做什麼?計算出的filteredItems是否只是在偵聽某些東西發生變化,以便知道再次獲取項目?如果是這樣,我應該能夠聽到我知道的任何事情會改變,當我想再次正確加載項目? – Jordan

+0

對。 「PeekAll」是對商店的實時查詢。所以無論何時您推送到商店,它都會更新,觸發'filteredItems'計算屬性來重新評估哪個會更新您的模板。 – mattmcmanus