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);
}