2

条件に基づいて Backbone ビューの tagName を切り替えようとしています。

最初は、「div」と言うデフォルトのタグ名を設定できると思っていました(これがデフォルトであることを認識しています)。その後、ビューの初期化関数で条件を確認してタグ名を変更しましたが、残念ながらうまくいきませんでした。

これが私のビューコードです(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 のままです。テンプレートが正しく切り替えられている間。

どんな助けでも大歓迎です。乾杯!

4

3 に答える 3

6

ビューは呼び出されるel前に設定されます。細かいマニュアルinitializeから:

エル view.el

すべてのビューには、常に DOM 要素 ( elプロパティ) があります...

そのため、すべてのビュー インスタンスには常に がelあり、特にが呼び出される前elにビューが作成されます。コンストラクターを変更しようとしていますが、既に存在しているため、単純な変更では効果がありません。tagNameinitialize@tagNameel@tagName

setElementビューの変更に使用できますel:

setElement view.setElement(element)

バックボーン ビューを別の DOM 要素に適用する場合は、setElementを使用します。これにより、キャッシュされた参照も作成され$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また、@options常にそこにある必要があるため、チェックする必要はありません。また、CoffeeScript を使用しているため、とにかくチェックしたい場合は、存在演算子のアクセサー バリアントの方がより慣用的です。

if @options.?device == 'mobile'

デモ: http://jsfiddle.net/ambiguous/j4mSu/1/

于 2012-05-29T18:37:02.413 に答える
1

バックボーン 0.9.9 (この質問が尋ねられた時点では存在しませんでした) の時点で、tagName フィールドは関数にすることができます。これは、ビューの作成時に tagName を動的に選択するために使用できます。

于 2014-07-01T17:19:00.867 に答える
1

タグ名を設定する代わりに、view.setElement(element) を直接使用してみましたか?

于 2012-05-29T17:49:45.450 に答える