Javascript EmberJS:重新加载控制器的最佳方法&x27;s模型基于另一个属性?

Javascript EmberJS:重新加载控制器的最佳方法&x27;s模型基于另一个属性?,javascript,ember.js,ember-data,Javascript,Ember.js,Ember Data,基于其他属性为当前控制器重新加载模型的最佳方法是什么 例如:我有一个post控制器。作者只能有一篇文章。如果currentAuthor属性更改,我想重新加载创建后表单 我试过这样做: App.PostEditController = Ember.ObjectController.extend modelReloadNeeded: Ember.observer((obj, keyName) -> postId = @get('currentAuthor').get('post_i

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

例如:我有一个post控制器。作者只能有一篇文章。如果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'
  )
它重新加载所有内容,但返回的不是真实的模型,而是承诺。 而且它看起来不像一个惯用的余烬解决方案


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

我很紧张,因为我不确定你是否正确地解决了这个问题,但是:

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

这将重新加载
PostEditController
的内容属性,从而在内容的
currentAuthor
属性更改时更新模板。

类似的内容将找到不同的帖子,然后将其设置为
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')
});

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')

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

  • 您可以将操作发送到当前路由上的呼叫
  • 刷新此路由和任何子路由上的模型,以与从其他路由过渡到时如何输入路由类似的方式触发beforeModel、model和afterModel挂钩

  • 您可以在url路径中指定动态段,并在路由或控制器中使用Transitiono方法
  • 您甚至可以在controller中提到与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.
    });
    

    是的,这会有帮助,但我有一个更复杂的情况:控制器是用一个新模型初始化的
    @store.createRecord'post'
    ,我希望它被一个加载的模型替换,而不仅仅是对当前模型进行简单的重新加载使用promise更可靠。this.store.find('post',{author\u id:this.get('currentAuthor.id')})。然后(函数(post){this.set('content',post);}) import Ember from 'ember'; export default Ember.Route.extend({ queryParams: { postId: { refreshModel: true } }, model(params) { //You will get query parameters value from the url through params.postId return this.get('store').query('article', params); } });
    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.
    });