12

基于另一个属性为当前控制器重新加载模型的最佳方法是什么?

例如:我有一个后控制器。作者只能有一篇文章。如果 currentAuthor 属性更改,我想重新加载创建后的表单。

我试过这样:

App.PostEditController = Ember.ObjectController.extend
  modelReloadNeeded: Ember.observer((obj, keyName) ->
    postId = @get('currentAuthor').get('post_id')

    if postId?
      @set('model', @store.find('post', postId))
  , 'currentAuthor.post_id'
  )

它重新加载所有内容,但返回的不是真实模型,而是承诺。而且它看起来不像是惯用的 Ember 解决方案。

也许有更好的方法来解决这个问题?

4

4 回答 4

2

我相信重新加载控制器模型相当于重新进入相​​同的路线。所以从 2.12.0 开始有很多可能性,

  1. 您可以向路由发送操作以在当前路由上调用刷新

刷新此路由和任何子路由上的模型,触发 beforeModel、model 和 afterModel 钩子,其方式与从其他路由过渡时进入路由的方式类似。

  1. 您可以在 url 路径中指定动态段,并在 Route 中使用 transitionTo 方法或控制器中使用 transitionToRoute。
路由器.map(函数(){
  this.route('posts');
  this.route('post', { path: '/post/:post_id' });
});

您可以说this.transitionTo('post',123)这将刷新当前路线,您将在模型挂钩中获得 123 作为参数。

https://guides.emberjs.com/v2.12.0/routing/defining-your-routes/#toc_dynamic-segments http://emberjs.com/api/classes/Ember.Route.html#method_transitionTo

  1. 您可以在路由中指定 queryParams,并将 refreshModel 设置为 true。
    从“ember”导入 Ember;
    导出默认 Ember.Route.extend({
      查询参数:{
        邮编:{
          刷新模型:真
        }
      },
      模型(参数){
        //你会通过params.postId从url获取查询参数值
        return this.get('store').query('article', params);
      }
    });

您甚至可以在控制器中提及与 queryParams 相同的 postId。postId设置属性时它将刷新路线。

import Ember from 'ember';
export default Ember.Controller.extend({
  queryParams: ['postId'],
  postId: null, //here is the default value. default value will not be shown in URL.
});

https://guides.emberjs.com/v2.12.0/routing/query-params/#toc_opting-into-a-full-transition

于 2017-03-20T04:21:34.213 回答
0

store.find会给你一个承诺,所以你应该解决它以避免没有方法调用的问题

App.PostEditController = Ember.ObjectController.extend
  modelReloadNeeded:(->
      postId = @get('currentAuthor').get('post_id')
      if postId?
        @store.find('post', postId).then (post) =>
          @set('content', post)
    ).observes('currentAuthor.post_id')
于 2013-09-07T18:28:19.403 回答
0

我很紧张给你一个解决这个问题的方法,因为我不确定你是否正确地处理它,但是:

App.PostEditController = Ember.ObjectController.extend({
  modelReloadNeeded: function () {
    this.get('content').reload();
  }.observes('currentAuthor')
});

这应该重新加载PostEditController的内容属性,因此只要内容的currentAuthor属性更改,就会更新您的模板。

于 2013-09-07T10:26:16.503 回答
0

像这样的东西会找到一个不同的帖子,然后将其设置为PostEditController.

App.PostEditController = Ember.ObjectController.extend({
  modelReloadNeeded: function () {
    // Find another post based on author id, tweak to suit your needs
    var otherPost = this.store.find('post',{ author_id : this.get('currentAuthor.id') })
    this.set('content', otherPost );
  }.observes('currentAuthor')
});
于 2013-09-07T18:12:02.807 回答