как уменьшить нагрузку на крюк модели в Ember - PullRequest
0 голосов
/ 05 мая 2020

У меня есть маршруты / бумага. js файл с хуком ниже модели

model(params,transition){
   let user = store.getRequest('user','paper/user')
   let address = store.getRequest('address','paper/address')

return RSVP.hash({
   user,
   address
}).then((model) => {
    set(model, 'address_name', get(model.address, 'name'));

    return ...model
})

}

Я хочу уменьшить нагрузку на хук модели, переместив запрос api на контроллер и используя его в setcontroller. но модель не имеет данных, пожалуйста, найдите ниже мою модификацию

// контроллер / бумага. js

testerfunction(params){
 let user = store.getRequest('user','paper/user')
   let address = store.getRequest('address','paper/address')
   let paperId = params.paperID

return RSVP.hash({
paperID: paperID,
   user,
   address
}).then((model) => {
    set(model, 'address_name', get(model.address, 'name'));

    return ...model
})

}


//routes/paper.js 


model(params,transition){

}


setupController(controller,model) {
 testerfunction(get(this,'model.params');
}

, но мой рендеринг страницы пуст

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Я бы рекомендовал использовать ember-concurrency . Ваш маршрут в конечном итоге будет выглядеть примерно так:

loadUser: task(function * () { return store.getRequest('user','paper/user') })
loadAddress: task(function * () { store.getRequest('address','paper/address') })
loadAddressName: task(function * (addressPromise) {
  const address = yield addressPromise
  return get(address, 'address_name')
})
model(params, transition) {
  const address = this.loadAddress.perform()
  const user = this.loadUser.perform()
  const address_name = this.loadAddressName.perform(address)
  return {
    user,
    address,
    paperID: params.paperID
  }
}

В качестве дополнительного бонуса вы получаете статус загрузки для каждого из них в вашем контроллере / шаблоне, поэтому вы можете делать такие вещи, как:

{{#unless model.user.isLoading}}
  {{model.user.name}}
{{else}}
  Some loading state
{{/unless}}

Другой вариант - добавить шаблон загрузки, который отображается при загрузке обработчика модели. Вам просто нужно добавить шаблон рядом с основным шаблоном под названием your_template_name_loading.hbs

1 голос
/ 06 мая 2020

Реализация по умолчанию для setupController:

setupController(controller, model) {
  set(controller, 'model', model);
}

Следовательно, у вас есть два варианта: вы можете вызвать реализацию по умолчанию, используя _super, или вы можете повторно реализовать ее. Также обратите внимание, что вам нужно сделать params частью объекта, возвращаемого обработчиком model. Наконец, ваш testerfunction возвращает обещание. В то время как model ожидает, что вы вернете обещание, setupController этого не делает.

model(params) {
  return { params };
}

setupController(controller, model) {
  return testerfunction(get(this, 'model.params')).then(resolvedModel => {
    this._super(controller, resolvedModel);
  });
}

Для получения дополнительной информации о setupController см. https://api.emberjs.com/ember/2.18/classes/Route/methods/setupController?anchor=setupController

Я написал этот ответ для совместимости с Ember 2.x на основе вашего кода, но, пожалуйста, в будущем сообщите нам, какую версию Ember вы используете.

...