我正在尝试根据条件切换主干 View 的tagName。
我最初以为我可以设置默认的tagName,例如“div”(我意识到这是默认设置),然后在 View 的Initialize函数中检查条件并更改tagName,但是不幸的是,此操作无效。
这是我的 View 代码(用coffeescript编写):
class Test.Views.ListView extends Backbone.View
attributes: {"data-role": "listview"}
className: 'row'
tagName: 'div'
initialize: ->
if @options and @options.device == "mobile"
@template = "/app/templates/mobile/test/test.html"
@tagName = 'ul'
使用此代码,tagName不会更改,它始终保持为div。正确切换模板后。
任何帮助,将不胜感激。干杯!
最佳答案
View 的el
是在调用initialize
之前设置的。从fine manual:
因此,所有 View 实例始终具有el
,尤其是在调用el
之前,根据 View 的tagName
创建initialize
。您正在尝试在构造函数中更改@tagName
,但是el
已经存在,因此对于简单的@tagName
更改生效没有为时已晚。
您可以使用 setElement
更改 View 的el
:
像这样:
initialize: ->
if @options and @options.device == "mobile"
@template = "/app/templates/mobile/test/test.html"
@setElement(@make('ul', _(@attributes).extend(class: @className)))
您还可以根据需要设置
@tagName = 'ul'
,但这无关紧要,因为tagName
仅在实例化 View 时使用。另外,@options
应该始终存在,因此您不必检查它,并且由于您使用的是CoffeeScript,因此如果您仍然要检查existential operator的访问器变量,它会更加惯用:if @options.?device == 'mobile'
演示:http://jsfiddle.net/ambiguous/j4mSu/1/
关于javascript - Backbone -根据条件更改tagName,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10804029/