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