【问题标题】:EmberJS: The best way to reload controller's model based on another property?EmberJS:基于另一个属性重新加载控制器模型的最佳方法?
【发布时间】:2013-09-07 10:12:27
【问题描述】:

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

例如:我有一个后期控制器。作者只能有一篇文章。如果 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 解决方案。

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

【问题讨论】:

    标签: javascript ember.js ember-data


    【解决方案1】:

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

    1. 您可以将操作发送到路由以在当前路由上调用refresh

    刷新此路由和任何子路由上的模型,触发 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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 是的,这会有所帮助,但我的情况有点复杂:控制器已使用新模型 @store.createRecord 'post' 进行初始化,我希望将其替换为已加载的模型,而不仅仅是简单地重新加载当前模型
      【解决方案3】:

      这样的东西会找到一个不同的帖子,然后将其设置为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')
      });
      

      【讨论】:

      • 使用promise更可靠。 this.store.find('post',{ author_id : this.get('currentAuthor.id') }).then(function(post) { this.set('content', post); })
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-21
        • 2013-11-24
        • 2015-05-01
        • 2012-11-10
        • 1970-01-01
        • 1970-01-01
        • 2019-09-26
        • 1970-01-01
        相关资源
        最近更新 更多