1

由于 EmberJS 发展得非常快,这又是一个问题 :)

[编辑]
我正在使用来自 github 的 EmberJS。这是我正在使用的版本
https://github.com/emberjs/ember.js/tree/c87ad9fc13f7883e7b898c9fb9b1630cb2fc9bf1
[/EDIT]

这个问题是 EmberJS 的后续 - Manually bind controller to view
但是你不需要阅读它来理解下面的问题。

我有一个 EmberJS 应用程序,我正在使用 requireJS 为路由器路由到的应用程序部分加载我的控制器和视图。

我的主要 index.html 有一个{{outlet}}将添加 ApplicationView 的位置。
我的 ApplicationView 有 3 个子视图 - 标题、菜单和容器 - 如下

require
(
    [
        'app/app',
        'app/common/views/menu',
        'ember'
    ],
    /**
     * Main application view
     *
     * @param App
     */
    function (App)
    {
        App.ApplicationView = Ember.ContainerView.extend
        ({
            childViews   : ['headerView', 'menuView', 'containerView'],
            headerView   : App.HeaderView,
            menuView     : App.MenuView,
            containerView: App.ContainerView
        });
    }
);

我的 ContainerView 如下

require
(
    [
        'app/app',
        'text!app/common/templates/container.hbs',
        'ember'
    ],
    /**
     * View to clear completed tasks
     *
     * @param App
     * @param template
     */
    function( App, template )
    {
        App.ContainerView = Ember.View.extend
        ({
            template: Ember.Handlebars.compile( template ),
            what: 'container view'
        })
    }
);

和它的模板是这样的
[编辑]
模板在它自己的文件app/common/templates/container.hbs中。我不想在 html
[/EDIT]中定义带有 script 标签的模板

<div id="container" class="container">
    my main content !!!
    {{outlet}}
</div>

现在我有一条路线,我想将模板/视图渲染到容器主出口(我也尝试命名出口)。

我想在我的路线上有这样的东西。请注意,控制器和视图之前没有加载,现在将在执行函数之前由 requireJS 加载。

define
(
    [
        'app/app',
        'app/library/controllers/library',
        'app/library/views/main',
        'ember'
    ],
    function (App)
    {
        App.LibraryRoute = Ember.Route.extend
        ({
            setupControllers: function(controller, model)
            {
                this.set('controller', this.container.lookup('controller:library') );
            },

            renderTemplates : function()
            {   
                this.render
                (   'library',
                    {
                    //  can I specify the view like so? 
                    //  It seems not as the container view is not part of the active views. 
                    //  can I specify the view like so?How to add it to the activeViews?
                    //  into: 'container',

                    //  I also tried to do
                    //  outlet: 'container'
                    //  with the outlet in the container template beeing named container, this doesn't work either
                        controller: this.controller
                    }
                );

//                This is what I am aiming for in the future, meaning loading resources only if the user is navigating to those
/*                require
                 (
                 [
                     'app/library/controllers/library',
                     'app/library/views/main',
                     'app/library/models/library'
                 ],
                 function()
                 {
                    // render template / view
                 )*/
            }
        })
    }
);

LibraryView 是这样的

require
(
    [
        'app/app',
        'text!app/library/templates/main.hbs',
        'ember'
    ],
    /**
     * View to clear completed tasks
     *
     * @param App
     * @param template
     */
    function( App, template )
    {
        App.LibraryView = Ember.View.extend
        ({
            template: Ember.Handlebars.compile( template ),
            what :'library view'
        });
    }
);

这个视图的控制器是这样的

require
(
    [
        'app/app',
        'ember'
    ],
    /**
     * Library controller
     */
    function(App)
    {
        App.LibraryController = Ember.ArrayController.extend
        ({
            needs: 'menu',
            content: []
        });
    }
)

问题可以恢复到这个
如何将视图/模板连接到子视图的出口(在应用程序初始化之前或之后加载,DOM 加载)?

我在这里https://github.com/zeflasher/ember-require-js在 GitHub 上创建了一个存储库,供您检查代码并可能帮助我解决此问题。

非常感谢您提供的任何帮助!!!干杯,泽维尔

[编辑 #4]
我想知道我的问题是否与其中一个错误有关,因为我正在指定我的模板
https://github.com/emberjs/ember.js/commit/712e2b62f79577b84630a99e80c043f751a67fe4
https://github.com/emberjs/ ember.js/commit/9bcc0cd87c587affc0e60030b2dac1174f820dbf
[/EDIT #4]

[编辑 #5]
更新了 github 项目以使用 ember commit ea6922f(撰写本文时已有 4 天)
仍然没有工作提出更多问题 :)
[/EDIT #5]

[编辑#6]
我已经更新了 github repo。
现在,当应用程序是具有插座的普通视图时,一个分支(working-no-containerview)在插座中呈现我的视图。

主分支是非工作示例(容器模板/视图出口中没有呈现任何内容)。我虽然尝试连接插座时子视图不是 _activeViews 的一部分,但它会失败,所以我什至尝试使用 ApplicationView 中的以下代码将我的子“容器”视图添加到活动视图中

require
(
    [
        'app/app',
        'app/common/views/menu',
        'ember'
    ],
    /**
     * Main application view
     *
     * @param App
     */
    function (App)
    {
        App.ApplicationView = Ember.ContainerView.extend
        ({
            childViews   : ['headerView', 'menuView', 'containerView'],
            headerView   : App.HeaderView,
            menuView     : App.MenuView,
            containerView: App.ContainerView,
            init: function()
            {
                App.__container__.lookup('router:main')._connectActiveView('container', App.__container__.lookup('view:container'));

                this._super();
            }
        });
        return App.ApplicationView;
    }
);

将它添加到activeViews,但仍然无法正常工作,并补充说在框架中深入到有这么简单的工作(在我的情况下仍然没有)看起来非常错误,所以我真的认为我错过了这里必不可少的东西。
[/编辑#6]

4

1 回答 1

2

这不是错误。ContainerViews 根本不呈现模板。请参阅Ember.ContainerView的 api 文档

容器视图上的模板、模板名称、默认模板、布局、布局名称或默认布局属性不会导致模板或布局被呈现。Ember.ContainerView 的 DOM 表示的 HTML 内容将只是其子视图的呈现 HTML。

如果你想在模板中渲染一个插座,你可以在 Ember.View 的子类中完成,没有任何问题。但如上所述,这不适用于 ContainerView,也不适用于 CollectionView,因为这是 Ember.ContainerView 的子类。

我还评论了您的问题:https ://github.com/emberjs/ember.js/issues/1795#issuecomment-12453015 ,我认为您可以自己关闭它。

最好的问候,迈克

于 2013-01-19T11:25:33.920 回答