请帮我找bug

mil*_*hov -3 javascript coffeescript backbone.js

这两个图像的说明 图片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()
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 12

现在每个人都已经击败了你,我会很高兴并告诉你你做错了什么.

你有一个简单的引用问题.首先,将user_data对象传递给您的函数.然后你再次参考user_data这里的要点:

window.user_profile = user_data
Run Code Online (Sandbox Code Playgroud)

现在您的数据如下所示:

window.user_profile ->-+
                       |
                       +->- {playlists: [ ], ...}
                       |
user_data ----------->-+
Run Code Online (Sandbox Code Playgroud)

然后你在user_data.playlists这里做另一个引用:

playlists_both_people = user_profile['playlists']
Run Code Online (Sandbox Code Playgroud)

现在你掌握了这个:

window.user_profile ->-+
                       |
                       +->- {playlists: [ ], ...}
                       |      ^
user_data ----------->-+      |
                              |
playlists_both_people --->----+
Run Code Online (Sandbox Code Playgroud)

然后你将一堆东西推到playlists_both_people阵列上,并想知道为什么它user_data.playlists也会改变.该图表告诉您原因:您从未复制过任何内容,您只是通过多个变量引用相同的数据.

你正在使用Backbone所以你有Underscore,或许_.clone可以帮助你:

playlists_both_people = _(user_profile['playlists']).clone()
Run Code Online (Sandbox Code Playgroud)

这将给你一个(浅)副本user_profile.playlists(user_data.playlists在这一点上是相同的),playlists_both_people而下一个forEach不会改变任何东西user_data.

请注意,您仍可能遇到双重引用问题window.user_profile.你不能只使用一个_.clone来解决这个可能的问题,你必须分别克隆每个成员,因为_.clone只有浅拷贝.但是,你可能有jQuery并$.extend支持深度复制,所以这可能是一个选项.

我也建议不要直接放东西window.例如,您最好为应用程序设置命名空间window.app,然后使用该命名空间:

window.app.user_profile = ...
Run Code Online (Sandbox Code Playgroud)