2

Backbone アプリがあり、次のようなものがあります。

render: function() {

   this.$el.html(_template());

   $('#id').plugin();

   return this;
}

#idは、レンダリングされている要素からのものです。実際に dom に挿入するには時間がかかるため、これは時々しか機能しません。

関数を呼び出す前に、このビュー内にコールバックを定義する方法や、dom が更新されたことを確認する方法はありますplugin()か?

ありがとうございました!

4

3 に答える 3

3

あなたの問題はこれです:

$('#id').plugin();

#idDOM 内を探していますがthis.$el、まだ DOM 内にありません。したがって、#idが 内this.$elにある場合#id、 は DOM にも存在せず、$('#id')空になります。#id内部を探したい場合this.$el、Backbone はそのためのthis.$ショートカットを提供します。

$ (jQuery または Zepto) view.$(selector)

jQuery または Zepto がページに含まれている場合、各ビューには、ビューの要素内で範囲指定されたクエリを実行する$関数があります。[...] 以下を実行するのと同等ですview.$el.find(selector)

だからあなたはこれをしたい:

this.$('#id').plugin();

プラグインで要素をレンダリングする必要がある場合 (おそらくサイズと位置の情報が必要な場合)、少し面倒なことをする必要があります。

  1. ビューが DOM に追加された後、呼び出し元はビューのメソッドを呼び出すことができます。
  2. ブラウザが DOM を更新した後、setTimeout(..., 0)または_.deferを使用してプラグインをバインドできます。ただし、これは、全員が共通のパターンを使用している場合にのみ機能します。x.append(v.render().el)
于 2012-10-29T18:24:10.600 に答える
0

イベントを単純にトリガーします。

MyView = Backbone.View.extend({

    initialize: function(){
        this.on('view:rendered', this.initPlugin, this);
    },
    render: function(){
        this.$el.html(_template());
        this.trigger('view:rendered', this/*or some useful data*/)
    },
    initPlugin: function(){
        this.$('#id').plugin()//watch on this.$ to apply selector inside this view only
    }
于 2012-10-29T18:00:08.773 に答える
0

よくわからないけどやってみる

イベントとしてビューにバインドし、ビューがレンダリングされた後に起動します

var viewobject = {};

_.extend(viewobject, Backbone.Events);

viewobject.on("alert", function(msg) {
  $('#id').plugin();
});

object.trigger("alert", "an event");
于 2012-10-29T18:07:31.353 に答える