Ember 如何在手动刷新页面的同时保留查询参数?
Ember How to retain query parameters while manually refreshing the page?
我正在使用 ember 2.7.0.while 手动刷新页面 ember 清除了 ember-data 以及我们的查询参数,所以我无法加载刷新时 setupController 中的页面。有什么方法可以同时保留模型和查询参数,至少保留查询参数可以重新加载我的页面。
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);
}
如有任何帮助,我们将不胜感激。
根据 Adam Cooper 评论编辑了 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 有什么方法可以停止页面呈现,直到查找记录解决承诺?
您需要为您的路线生成一个实际控制器,然后在控制器中定义一个queryParams 属性。看起来您要保留的查询参数是 isdn,因此您的控制器应该类似于:
export default Ember.Controller.extend({
queryParams: ['isdn']
});
"manually refreshing the page ember clears the ember-data as well us query parameters"
一旦您完全刷新浏览器,就会创建一个新的 ember 应用程序实例,因此无法保留 ember-数据。 Ember-数据仅用于UI上的应用程序,一旦ember退出将不会保留。
"as well us query parameters"
您的查询参数是您 url 的一部分,不应清除。确保存在以下两个
在你的控制器中包含查询参数,即
queryParams: ['param1', 'param2']
并在您的路线中确保您已完成
queryParams : {
param1: {
refreshModel: true
},
param2: {
refreshModel: true
}
}
"Page gets rendered before "findRecord" return承诺"
您做错了什么,适配器、模型、序列化程序等是否正确定义(如果需要)以便使用 findRecord?只是为了调试 return 一个普通对象并确保在渲染之前调用你的 setupController。即
model() {
return {dummy: 'dummy'};
}
您正在设置路由属性而不是控制器..
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);
}
我正在使用 ember 2.7.0.while 手动刷新页面 ember 清除了 ember-data 以及我们的查询参数,所以我无法加载刷新时 setupController 中的页面。有什么方法可以同时保留模型和查询参数,至少保留查询参数可以重新加载我的页面。
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);
}
如有任何帮助,我们将不胜感激。
根据 Adam Cooper 评论编辑了 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 有什么方法可以停止页面呈现,直到查找记录解决承诺?
您需要为您的路线生成一个实际控制器,然后在控制器中定义一个queryParams 属性。看起来您要保留的查询参数是 isdn,因此您的控制器应该类似于:
export default Ember.Controller.extend({
queryParams: ['isdn']
});
"manually refreshing the page ember clears the ember-data as well us query parameters"
一旦您完全刷新浏览器,就会创建一个新的 ember 应用程序实例,因此无法保留 ember-数据。 Ember-数据仅用于UI上的应用程序,一旦ember退出将不会保留。
"as well us query parameters"
您的查询参数是您 url 的一部分,不应清除。确保存在以下两个
在你的控制器中包含查询参数,即
queryParams: ['param1', 'param2']
并在您的路线中确保您已完成
queryParams : {
param1: {
refreshModel: true
},
param2: {
refreshModel: true
}
}
"Page gets rendered before "findRecord" return承诺"
您做错了什么,适配器、模型、序列化程序等是否正确定义(如果需要)以便使用 findRecord?只是为了调试 return 一个普通对象并确保在渲染之前调用你的 setupController。即
model() {
return {dummy: 'dummy'};
}
您正在设置路由属性而不是控制器..
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);
}