我正在尝试根据条件切换主干 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/

10-14 08:08