Javascript 带主干的函数式反应式编程

Javascript 带主干的函数式反应式编程,javascript,backbone.js,Javascript,Backbone.js,我有一个正常的主干。由用户模型组成的集合。模型和系列没有什么特别之处 当我清除主干集合时,通过对每个模型调用destroy,程序中对其中一个已销毁模型的另一个引用似乎保持不变。我的问题是-如何编写JS程序,以便在用户集合中的所有模型都被销毁时,appState.currentUser(见下文)中的引用被设置为null。我是否需要使用一些花哨的东西,比如事件或“函数式反应式编程”,或者JavaScript应该能够立即处理这些问题?现在,当我清除所有模型时,appState.currentUser变

我有一个正常的主干。由用户模型组成的集合。模型和系列没有什么特别之处

当我清除主干集合时,通过对每个模型调用destroy,程序中对其中一个已销毁模型的另一个引用似乎保持不变。我的问题是-如何编写JS程序,以便在用户集合中的所有模型都被销毁时,appState.currentUser(见下文)中的引用被设置为null。我是否需要使用一些花哨的东西,比如事件或“函数式反应式编程”,或者JavaScript应该能够立即处理这些问题?现在,当我清除所有模型时,appState.currentUser变量不会“变为null”,即使appState.currentUser引用了一个主干用户模型(!)

我有一个简单的单例数据结构,表示应用程序的状态-登录用户、环境等:

define('appState',function() {

    var appState = {

        currentUser: null,
        authorized: null,
        hasSession: null,
        env: null

    };

    return {
        value: appState,
        get: function(val){
            return appState[val];
        },
        set: function(prop,val){
            if(prop in appState){
                console.log('application state from this :',appState);
                if(prop === 'currentUser' && val !== null){
                    appState['authorized'] = true;
                }
                else{
                    appState['authorized'] = false;
                }
                appState[prop] = val;
                console.log('application state changed to :',appState);
            }
            else{
                throw new Error('no appState property matched.');
            }
        }
    }
});
当用户登录时,该信息将与一组所有注册用户匹配,如下所示:

    collections.users.fetch().done(function () {

                     for (var i = 0; i < collections.users.models.length; i++) {

                            if (user.username === collections.users.models[i].get('username')) {

                            appState.set('currentUser', collections.users.models[i]);
                             break;
                                 }

                          }

                         if (appState.get('currentUser') == null) {
                                throw new Error('null or undefined currentUser');
                           }
                         else {

                           Backbone.Events.trigger('bootRouter', 'home');
                          }
                   });
collections.users.fetch().done(函数(){
对于(var i=0;i
我做错了什么,还是JavaScript不允许我做我想做的事情?我宁愿不必处理主干收集“销毁”事件,但也许我也无能为力


是的,处理这个问题的相当详细和样板的方法是监听模型“destroy”事件,然后将另一个引用设置为null,但这需要更多的监督,并且比希望的更好的解决方案更容易出错。

我不确定这是JS的问题。除非有某种形式的观察者,你才是引用它的人,除非你清除它,否则没有理由清除它。好的,当然,那我怎么清除引用呢。如果JS中的两个对象引用同一个JS对象。一个在数组中,另一个在对象中。数组中的引用被删除或设置为null,对象中的引用也应该为null吗?可能是因为主干销毁实际上并没有将数组中的对象(用户模型)设置为null,它只是将它们从数组中删除,我想我不知道。您来自哪种语言?这是可能的(不是参考检索)?在我的脑海中(例如,我经常使用的语言),我不知道有哪种语言可以在没有某种形式的观察或简单编程的情况下做你想做的事情。我建议将appState作为主干。模型-它有get、set和事件。你是如何清理这些藏品的?通常您会执行
collection.reset()
,这会触发一个重置事件。在该事件或自定义事件中,您可以执行
appState.unset('currentUser')
-我认为该模型将被垃圾收集-有一些方法可以强制在浏览器中进行垃圾收集(否则可能不会立即发生),我不确定这是JS的问题。除非有某种形式的观察者,你才是引用它的人,除非你清除它,否则没有理由清除它。好的,当然,那我怎么清除引用呢。如果JS中的两个对象引用同一个JS对象。一个在数组中,另一个在对象中。数组中的引用被删除或设置为null,对象中的引用也应该为null吗?可能是因为主干销毁实际上并没有将数组中的对象(用户模型)设置为null,它只是将它们从数组中删除,我想我不知道。您来自哪种语言?这是可能的(不是参考检索)?在我的脑海中(例如,我经常使用的语言),我不知道有哪种语言可以在没有某种形式的观察或简单编程的情况下做你想做的事情。我建议将appState作为主干。模型-它有get、set和事件。你是如何清理这些藏品的?通常您会执行
collection.reset()
,这会触发一个重置事件。对于该事件或自定义事件,您可以执行
appState.unset('currentUser')
-我认为该模型将被垃圾收集-有一些方法可以强制在浏览器中进行垃圾收集(否则可能不会立即发生)