EmberJS:根据另一个属性重新加载控制器模型的最佳方法?

时间:2013-09-07 10:12:27

标签: javascript ember.js ember-data

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

例如:我有一个帖子控制器。作者只能有一个帖子。如果currentAuthor属性发生变化,我想重新加载post创建表单。

我试过这种方式:

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 个答案:

答案 0 :(得分:1)

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

  1. 您可以发送操作以路由到当前路线致电refresh
  2.   

    刷新此路线和任何子路线上的模型,触发beforeModel,model和afterModel挂钩,其方式与从其他路线转换时输入路线的方式类似。

    1. 您可以在网址路径中指定动态网段,并在路由中使用transitionTo方法或在控制器中使用transitionToRoute
    2. Router.map(function() {
        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。
      2.     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);
              }
            });
        

        你甚至可以在控制器中提到与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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分: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')
});

答案 3 :(得分: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')