0

簡単に診断できると思われる問題が発生していますが、自分で解決できないようです。

CoffeeScript で記述された次の短縮されたバックボーン コードがあります。

events = FD.Events # collection

# instantiated on page load with collection: events
class FD.StreamView extends Backbone.View

el: $(".stream")

initialize: ->
    # Bind the view to listen for a reset of the collection and rerender
    @collection.on("reset", @render)

    # Listen for a change to this model and run the function getActivities
    FD.filters.on("change", @getActivities)

render: =>
    # render function code

getActivities: =>
    # create a new instance of the FD.Events collection class
    events = new FD.Events

    # create a new instance of this view, passing in the new empty collection
    streamView = new FD.StreamView collection: events, model: FD.filters

    # make an AJAX call and as a part of the callback function, reset the collection
    # for the view we just instantiated above
    params = FD.filters.attributes
    callbackFunc = (responseText) ->
        json = $.xml2json(responseText)
        activities = json.activity
        events.reset activities
    params = FD.filters.attributes
    activities_json = $.get("/landing/Data", params, callbackFunc)  

問題は、コレクションが呼び出されるたびに getActivities 関数が 2 倍の回数実行されることです。これは、最初に実行すると 2 番目のビューが作成され、その後両方が実行されるためです。コレクションが変更されると、これら 2 つのインスタンスのそれぞれが 2 つのインスタンスを作成するため、現在は 4 つになり、4 つすべてで getActivities を実行します。それから 8、そして 16 です。

FD.StreamView クラスの新しいインスタンスを作成することは明らかに正しいアプローチではありませんが、単一のビューが関連付けられているコレクションをリセットする方法と、バインドされた @render 関数をトリガーする方法がわかりません。

何か案が?重要な情報が不足している場合はお知らせください。前もって感謝します。

マイケル

4

1 に答える 1

0

必要な構造は、アプリケーションの詳細に応じて、ビューrenderをコレクションのイベントにバインドすることです。ただし、メソッドを介してデータをフェッチするようにコレクションに指示する必要がありますが、現在のフィルターのセットを使用します(これは検索クエリであると想定しています)。したがって、コレクションクラスに呼び出されるインスタンスプロパティをdoで追加し、次に。を追加します。応答が到着すると、コレクションがリセットされ、実行と出来上がりを引き起こすイベントが発生し、ビューが最新になります。ajaxリクエストを作成しているコードは、ビューではなくコレクションに属しています。resetadd/removegetActivitiesfetchfiltersgetActivitiesevents.filters = FD.filtersevents.fetch()render()render()

于 2012-04-05T05:02:26.123 に答える