2016-08-15 55 views
1

我使用的是ember 2.7.0.while手動刷新頁面餘燼清除餘燼數據以及我們的查詢參數,所以我無法在刷新時在setupController中加載頁面。是否有任何可能的方式保留模型&查詢參數,至少保留查詢參數將罰款重新加載我的網頁。Ember如何在手動刷新頁面時保留查詢參數?

route.js

model(params) { 
    return this.store.peekRecord("book",params.book_id); 
}, 

setupController(controller,model,params){ 
    if(!model){ 
    //fetch book record again if the model is null 
    } 
    controller.set('isdn',params.queryParams.isdn); 
    controller.set('book',model); 
} 

任何幫助應該是明顯的。

編輯setupController按照亞當·庫珀評論:

setupController(controller,model,params){ 
var isdn = params.queryParams.msisdn; 
controller.set('isdn',isdn); 
if(!model){ 
    this.store.findRecord('book', isdn).then((customer) => { 
    this.set('book',customer); 
},(resp,status) => { 
    this.set('errorMessage', `Book with this ${isdn} does not exist.`); 
    this.set('book', []); 
}); 
}else{ 
    controller.set('device',model); 
} 
} 

頁被「findRecord」返回promise.Is有什麼辦法可以阻止網頁渲染,直至找到記錄解析的承諾之前渲染?

+0

https://developer.mozilla.org/en-US/docs/Web/API/Storage/setItem你可以使用localStorage? LocalForage可能更適合您的需求,因爲它增加了靈活性並能夠存儲不同的數據類型。 –

+0

除了localStorage之外,還有其他的選擇嗎?我們有沒有任何監聽器可以在燼中刷新事件? – VelNaga

+0

對不起@velNaga,我不是Ember用戶。 –

回答

1

您在路徑屬性而不是控制器設置..

setupController(controller, model, params){ 
var isdn = params.queryParams.msisdn; 
controller.set('isdn', isdn); 
if(!model){ 
    this.store.findRecord('book', isdn).then((customer) => { 
    controller.set('book', customer); 
}, (resp, status) => { 
    controller.set('errorMessage', `Book with this ${isdn} does not exist.`); 
    controller.set('book', []); 
}); 
}else{ 
    controller.set('device', model); 
} 

}

只有控制器屬性將裝飾模板。

你甚至可以嘗試下面的內容,爲什麼你不給機會模型鉤來解決,因爲這將等待Promises解決。

model(params) { 
    var result = this.store.peekRecord("book",params.book_id); 
    if(result !== null){ 
     result= this.store.findRecord('book', params.book_id) 
    } 
    return result; 
} 
setupController(controller,model){  
    controller.set('book',model); 
} 
+0

非常感謝您的回答,它就像是一個魅力。現在,我可以使用模型數據呈現頁面,而頁面刷新 – VelNaga

1

您需要爲您的路線生成一個實際的控制器,然後在控制器中定義一個queryParams屬性。它看起來像你想保存查詢參數上是ISDN所以控制器應該是這個樣子:

export default Ember.Controller.extend({ 
    queryParams: ['isdn'] 
}); 
+0

感謝您的快速response.I能夠保留queryParams是否有任何方法來保持更新時的餘燼數據? – VelNaga

+0

我編輯我的問題。頁面獲取呈現之前查找記錄解決承諾,請你指導我解決這個問題? – VelNaga

1

「手動刷新頁面灰燼清除餘燼的數據以及我們的查詢參數」

完全刷新瀏覽器後,會創建一個新的應用程序實例,因此不能保留它。 Ember-data僅用於UI上的應用程序,一旦退出了它,它將不會被保留。

「以及我們的查詢參數」

您的查詢參數是您的網址的一部分,它不應該被清除。請確保以下兩個是目前

包括在烏拉圭回合控制器queryParams即

queryParams: ['param1', 'param2'] 

而且在你的路線,確保你已經做

queryParams : { 
    param1: { 
     refreshModel: true 
    }, 
    param2: { 
     refreshModel: true 
    } 
} 

findRecord「頁面獲取之前渲染‘’返回承諾「

你沒有做正確的事情,是適配器,模型,序列化器等正確定義(如果需要),以便使用findRecord?只是爲了調試返回一個普通的對象,並確保你的setupController在渲染之前被調用。即

model() { 
    return {dummy: 'dummy'}; 
} 
+0

我跟着亞當爾斯勒答案,我能夠保留查詢參數,但你的答案有點不同。有什麼區別?爲什麼我要在路由中查詢參數?哪個是好的做法?然後,我希望我的適配器配置正確,它正在打擊數據庫並返回數據,但它還在談論一段時間,我也在模型函數中嘗試過,但沒有使用仍然控制不等待promise來解決。頁面呈現控制來承諾解決但頁面不重新渲染 – VelNaga

+0

感謝您的回答 – VelNaga

+1

「爲什麼我要查詢路由中的PARAMS」,讓它在路線意味着設置任何queryparams將重新加載路線,我也已經發現許多邊緣案例,其中路線設置有助於其他問題。當你說「頁面呈現控制達成承諾解決但頁面不能重新呈現」時,你是否正在接受設置控制器中的承諾?設置控制器的承諾永遠不會等待。只有在模型和模型掛鉤之前等待承諾才能解決 – wallop