使用动态模板插入视图

时间:2013-05-31 15:19:48

标签: ember.js

我正在尝试插入一个动态视图(制作工具提示),该动态视图具有动态模板以进行渲染,因此在创建内容并将视图附加到父元素。我收到以下错误

Uncaught Error: assertion failed: You specified the templateName ... for <(subclass of Ember.View):ember1104>, but it did not exist. 

模板存在,我可以使用视图助手在其他模板中添加视图。这是我的父视图示例:

App.ModalOverlayView = Ember.View.extend
  templateName: 'modal_overlay/layout'

didInsertElement: ->
  textView = Ember.View.extend({templateName: @get('templateToShow')}).create()
  textView.appendTo(@$('.text'))

1 个答案:

答案 0 :(得分:3)

Bassically我在页面的各个部分做了你想做的事。

所以我所做的是为我想渲染的视图设置了容器视图。例如:

{{view MainApp.AppContainerView elementId="appContainerView"}}

然后,当我需要在容器内部渲染一个espefic模板时,我用ajax对它进行了编码。例如,如果我想显示模板&#34; xpto&#34;,我将此模板放在名为&#34; xpto.handlebars&#34;的文件中。所以我这样做了:

 view = Ember.View.create({
                willInsertElement : function(){
                    var isLoaded = this.isLoaded;
                    if(!isLoaded){
                        getTemplate("/app_dev/templates/" + templateName + ".handlebars", this);
                    }
                }
            });

其中&#34; templateName&#34;它是您要显示的模板的名称,在这种情况下是&#34; xpto&#34;和&#34; getTemplate&#34;它是获取模板的ajax函数:

function getTemplate(path, view){
    $.ajax({
        url: path,
        xhrFields: {
            withCredentials: true
        },
        //cache: true,
        success: function(data) {
            var templateName = "";
            $(data).filter('script[type="text/x-handlebars"]').each(function() {
                templateName = $(this).attr('data-template-name');
                Ember.TEMPLATES[templateName] = Ember.Handlebars.compile($(this).html());
            });
            if(view != null){
                view.set("templateName", templateName);
                view.rerender();
            }

        }               
    });    
}

最后我这样做是为了将视图添加到容器中:

    var containerView = Em.View.views['appContainerView']; 
    if(containerView == undefined)
        return;
    var temp =  containerView.toArray(); 
    if(temp.length > 0)
        containerView.unshiftObject();
    containerView.addObject(view);

我希望这可以帮到你,

尼托