Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Backbone.js视图标记名是否动态设置?_Javascript_Html_Backbone.js - Fatal编程技术网

Javascript Backbone.js视图标记名是否动态设置?

Javascript Backbone.js视图标记名是否动态设置?,javascript,html,backbone.js,Javascript,Html,Backbone.js,我正在尝试使用jQueryMobile和Backbone.js为Phonegap项目建立基础架构 我们将瞄准多个平台,并计划在未来进行扩展。 我希望我的主干代码完全不知道与视图相关联的HTML元素的类型,因为我们不知道跨平台的视图是什么样子。 一个简单的例子是,在一个平台上,项目列表可能由UL和LI元素组成,但在另一个平台上,出于某种原因,我们可能希望将其切换为DIV和P元素 目前,如果我不指定标记名,它默认为DIV 我希望能够在一个页面上提供这样的模板: <script id="atta

我正在尝试使用jQueryMobile和Backbone.js为Phonegap项目建立基础架构
我们将瞄准多个平台,并计划在未来进行扩展。
我希望我的主干代码完全不知道与视图相关联的HTML元素的类型,因为我们不知道跨平台的视图是什么样子。
一个简单的例子是,在一个平台上,项目列表可能由
UL
LI
元素组成,但在另一个平台上,出于某种原因,我们可能希望将其切换为
DIV
P
元素

目前,如果我不指定标记名,它默认为
DIV

我希望能够在一个页面上提供这样的模板:

<script id="attachmentTemplate" type="text/template">
     <li><a href="#"><%= title %></a></li>
</script>

  • 另一方面,提供:

    <script id="attachmentTemplate" type="text/template">
        <p><a href="#"><%= title %></a></p>
    </script>
    
    
    

    如果不指定标记名(如我所说,它默认为
    DIV
    ),我就不能这样做


    有没有人对此有什么建议或方法?关键是我不想让Javascript知道HTML元素的类型,我想让HTML来定义它。

    像往常一样,我搜索了又搜索,没有找到答案,然后我问了一个问题,自己解决了

    我发现如果我像这样制作模板:

    <script id="attachmentTemplate" tagname="li" type="text/template">
        <a href="#"><%= title %></a>
    </script>
    
    
    
    然后在我的js代码中,当实例化我的视图时,我可以这样做:
    var attachmentView=new AttachmentListItemView({tagName:$('#attachmentTemplate').attr('tagName'),model:item})

    而且它工作得很好。

    不知道这是否是有效的HTML,也不知道会不会导致任何问题。

    尽管我不推荐这种架构,但您可以覆盖渲染方法:

    render: function() 
    {
        // unbind all handlers since delegateEvents was called in the constructor
        this.undelegateEvents();
        // set this.el to the domElement from the templates
        this.el = this.template(this.model.toJSON()); // or however you get to your template
        // create the shorthand dom reference that setElement() creates
        this.$el = $(this.el);
        // re-delegate the events
        this.delegateEvents();
    }
    
    这意味着您不必担心您在模板中定义的标记名

    编辑:查看主干代码,这正是
    setElement
    所做的,因此理论上您可以尝试

    render: function() 
    {
        var tpl = this.template(this.model.toJSON());
        this.setElement(tpl, true);
        return this;
    }
    

    您可以使用函数在视图中指定标记名属性,因此它将是动态的

    ...
    
    tagName: function(){
        return this.model.get('tagName');
    },
    
    ...
    

    签出这把小提琴

    我对主干网是100%全新的,你介意再解释一下这段代码的作用吗?我假设
    delegateEvents
    undelegateEvents
    是您自己的实践,而不是一个标准?顺便说一句,我的呈现函数已经包含以下代码:
    $(this.el).html(this.template(this.model.toJSON())我不理解其中的区别。delegateEvents是一个主干方法,在调用视图的构造函数方法时会在内部调用,它所做的是绑定视图中指定的事件并附加它。取消LegateEvents将撤消该操作。查看文档,我觉得我更喜欢你的解决方案。看起来更干净。但是,你知道setElement方法会引发任何不需要的事件吗?也就是说,如果我指定了“更改”事件或其他事件,它会在渲染期间触发吗?(特别是因为这确实是我第一次渲染元素)在您的头脑中明确区分主干如何处理DOM事件(单击、悬停等)和将事件绑定到视图/模型/集合。。。您的更改事件绑定到模型或集合。+1:看起来很优雅!我认为额外的争论不是问题。XML就是这样被设计成可扩展的(并且忽略读者不理解的额外属性/元素)。因此,IMHO,这是一个完美的解决方案。如果您已经在页面上预装了模板,这是一个可以正常工作的解决方案。如果您必须异步加载模板,这可能会变得很棘手,因为模板不会插入DOM中。这是正确的解决方案@詹姆斯·怀特,你应该接受这个!