-3

この 2 つの画像の説明 画像1 画像2

コード

showUserProfile: (user_data)->
    console.log "Routers.AppRouter showUserProfile()", user_data
    window.user_profile = user_data

    playlists_both_people = user_profile['playlists']

    my_profile['playlists'].forEach (pl)-> playlists_both_people.push(pl)

    @playlists = new Playlists.Collections.PlaylistsCollection( playlists_both_people )

    $("#app").html( new Playlists.Views.User.ShowView(user_data).render().el )
    @ok()
4

1 に答える 1

13

誰もがあなたを殴り終えたので、私は親切にして、あなたが間違っていることを教えてあげます.

簡単な参照の問題があります。user_data関数に渡されるオブジェクトから始めます。次に、ここで何user_dataを指しているかについて別の参照を作成します。

window.user_profile = user_data

データは次のようになります。

window.user_profile ->-+
                       |
                       +->- {playlists: [ ], ...}
                       |
user_data ----------->-+

次に、user_data.playlistsここに別の参照を作成します。

playlists_both_people = user_profile['playlists']

そして今、あなたはこれを手にしています:

window.user_profile ->-+
                       |
                       +->- {playlists: [ ], ...}
                       |      ^
user_data ----------->-+      |
                              |
playlists_both_people --->----+

そして、配列に多くのものをプッシュし、playlists_both_peopleなぜそれが変更されたのか疑問に思いuser_data.playlistsます。この図は、その理由を示しています。何もコピーを作成したことがなく、複数の変数を介して同じデータを参照しているだけです。

バックボーンを使用しているため、アンダースコアがあり、おそらく_.clone役立つでしょう:

playlists_both_people = _(user_profile['playlists']).clone()

これにより、 の (浅い) コピー(この時点user_profile.playlistsと同じ) が得られ、次は で何も変更されません。user_data.playlistsplaylists_both_peopleforEachuser_data

との二重参照の問題がまだある可能性があることに注意してくださいwindow.user_profile。ただし、この問題を解決するために 1 つだけを使用することはできません。浅いコピーしか行わない_.cloneため、各メンバーを個別に複製する必要があります。_.cloneただし、おそらく jQuery があり$.extend、ディープ コピーがサポートされているため、オプションになる可能性があります。

に直接物を入れることもお勧めしませんwindow。たとえばwindow.app、アプリケーションの名前空間を設定してから、その名前空間を使用することをお勧めします。

window.app.user_profile = ...
于 2012-04-16T22:04:33.757 に答える