0

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

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

1 回答 1

3

基本上我在页面的各个部分做了你想要的。

所以我所做的就是为我想要渲染的视图创建一个容器视图。例如:

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

然后,当我需要在该容器内渲染一个特殊的模板时,我通过 ajax 将其加载。例如,如果我想显示模板“xpto”,我将这个模板放在一个名为“xpto.handlebars”的文件中。所以我这样做了:

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

其中“templateName”是您要显示的模板的名称,在本例中是“xpto”,“getTemplate”是获取模板的 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);

我希望这可以帮助你,

华尼托

于 2013-06-02T09:58:08.397 回答