EmberJS 从控制器加载视图而不是路由

Posted

技术标签:

【中文标题】EmberJS 从控制器加载视图而不是路由【英文标题】:EmberJS loading view from controller not route 【发布时间】:2014-06-25 19:06:08 【问题描述】:

在一个路由中,我渲染多个出口,对于每个出口,我使用带有content 变量的控制器加载其内容。我想为每个插座显示一个加载视图,但不知道怎么做,因为它们没有加载路径(所以我不能只创建一个车把)。

当我的应用程序启动时,使用loading 车把显示加载视图没有问题。但是对于我的网点,我既没有路由也没有资源,因此在检查 Ember 控制台时没有可用的加载路径或加载模板。

我需要找到一个技巧,以便在获取 content 时在我的插座中显示加载视图。

有什么想法吗?

我插入插座的路线:

App.ProfileRoute = Ember.Route.extend(
    renderTemplate: function() 
        this.render(); // default behavior, renders the default template

        // loads documents outlet
        this.render('documents', 
            into: 'profile',
            outlet: 'documents',
            controller: 'documents'
        );

        // load other outlets after
    
);

相关车把:

<script type="text/x-handlebars" data-template-name="profile">
  <div id="profile-sections">
    outlet documents
    outlet accounts
    outlet contacts
  </div>
</script>

控制器:

App.DocumentsController = Ember.ArrayController.extend(
    itemController: 'document',

    content: function () 
        return this.store.findAll('document');
    .property()
);

然后,在documents.hbs 模板中,我只是遍历文档,将它们链接到项目控制器,并拥有我的逻辑。就这样。我尝试将loading 函数添加到控制器的actions 中,但它不起作用(只是记录了一些文本但没有显示任何内容)。

谢谢,

【问题讨论】:

【参考方案1】:

我个人会将所有这些发现添加到模型挂钩中,并使用默认加载路线。像这样的东西(我猜的是帐户和联系人的模型)。

App.ProfileRoute = Ember.Route.extend(
  model: function()
    return Ember.RSVP.hash(
      documents: this.store.find('document'),
      accounts: this.store.find('account'),
      contacts: this.store.find('contact')
    );
  
);

然后在你的模板中使用render

<script type="text/x-handlebars" data-template-name="profile">
  <div id="profile-sections">
    render 'documents' documents
    render 'accounts' accounts
    render 'contacts' contacts
  </div>
</script>

【讨论】:

效果很好,谢谢!唯一的缺点是我想为我的每个部分(它们是可折叠部分)提供一个加载视图,这里是一个通用的,用于文档、联系人等。但我认为这就足够了,只需要找到加载时正确的消息和良好的用户界面,现在应该足够了:)【参考方案2】:

所以我只想补充一点,我做了一些不同的事情,所以我仍然可以保留我的插座,而不是像那样渲染视图。我有一些使事情变得复杂的需求,这里是我的解决方案:

路线:

App.ProfileRoute = Ember.Route.extend(
    model: function()
        return Ember.RSVP.hash(
            accounts: this.store.findAll('account'),
            documents: this.store.findAll('document'),
            contacts: this.store.findAll('contact')
        );
    ,

    setupController: function(controller, model) 
        this.controllerFor('accounts').set('model', model.accounts);
        this.controllerFor('documents').set('model', model.documents);
        this.controllerFor('contacts').set('model', model.contacts);
    ,

    renderTemplate: function() 
        this.render(); // default behavior, renders the default template

        // loads accounts outlet
        this.render('accounts', 
            into: 'profile',
            outlet: 'accounts',
            controller: 'accounts'
        );

        // loads documents outlet
        this.render('documents', 
            into: 'profile',
            outlet: 'documents',
            controller: 'documents'
        );

        // loads contacts outlet
        this.render('contacts', 
            into: 'profile',
            outlet: 'contacts',
            controller: 'contacts'
        );
    
);

然后在模板中:

<script type="text/x-handlebars" data-template-name="profile">
  <div id="profile-sections">
    outlet documents
    outlet accounts
    outlet contacts
  </div>
</script>

还有易于装载的车把:

<script type="text/x-handlebars" data-template-name="profile/loading">
  <div id="profile-loading">
    My loading spinner and text
  </div>
</script>

而且效果很好。

【讨论】:

以上是关于EmberJS 从控制器加载视图而不是路由的主要内容,如果未能解决你的问题,请参考以下文章

在 emberjs 中重新渲染视图

控制器返回 application/json 而不是视图

如果从不同的视图控制器按下返回,则重新加载而不重新加载。迅速

如何在 Ember js 控制器功能测试中调用路由功能?

如何将标签栏控制器放在视图控制器而不是委托中?

EmberJS View - 检测是不是所有子视图都已呈现