Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将会话数据与其他角度指令和控制器同步_Javascript_Angularjs_Session_Angularjs Directive_Angular Services - Fatal编程技术网

Javascript 将会话数据与其他角度指令和控制器同步

Javascript 将会话数据与其他角度指令和控制器同步,javascript,angularjs,session,angularjs-directive,angular-services,Javascript,Angularjs,Session,Angularjs Directive,Angular Services,在我的AngularJS应用程序中,我有一个会话服务对象,其中包含诸如当前用户、他们的首选项、他们所属的当前公司以及他们正在使用的当前主题等内容。我的应用程序中的许多地方在需要获取这些数据时都会引用会话服务 因为这些变量在服务中,所以我不能使用范围监视来检测更改。因此,我决定使用观察者模式。应用程序中的各个位置(如其他服务、指令、控制器等)将向会话服务注册自己,并提供在会话更改时执行的回调 例如,如果用户更改了主题,将通知index.html中使用自定义指令的元素,它将为新颜色重新创建所有覆盖的

在我的AngularJS应用程序中,我有一个会话服务对象,其中包含诸如当前用户、他们的首选项、他们所属的当前公司以及他们正在使用的当前主题等内容。我的应用程序中的许多地方在需要获取这些数据时都会引用会话服务

因为这些变量在服务中,所以我不能使用范围监视来检测更改。因此,我决定使用观察者模式。应用程序中的各个位置(如其他服务、指令、控制器等)将向会话服务注册自己,并提供在会话更改时执行的回调

例如,如果用户更改了主题,将通知
index.html
中使用自定义指令的
元素,它将为新颜色重新创建所有覆盖的css规则

例如,每当用户的化身被更新时,主菜单栏控制器将被通知刷新和重画化身。像这样的东西

显然,会话中的数据必须在各种控制器、指令等使用它之前至少刷新一次。请求会话服务获取其会话数据的自然位置是应用程序级模块的
run
块。这很好,但我也不认为这是最好的地方

我注意到的一个问题是,当Firebug打开时,加载事物的异步性质会导致排序问题。例如,在
元素上运行的指令将在应用程序的运行块中刷新会话服务后运行。。。这意味着按F5键后主题将不会更新,因为回调是在数据初始化后注册的。我必须在这里调用手动刷新以保持同步,但如果我这样做,它可能会在顺序不同的时间执行两次!这是一个大问题。我不认为这个问题只是和Firebug有关。。。这种情况在任何情况下都可能发生,但Firebug似乎在某种程度上始终如一地导致了这种情况,这是不好的

重述。。。这种异步排序很好:

  • 主题指令注册对会话的回调
  • 菜单栏应用程序控制器向会话注册回调
  • .run
    块中调用Session.refresh()
  • 此异步排序不正确:

  • 菜单栏应用程序控制器向会话注册回调
  • .run
    块中调用Session.refresh()
  • 主题指令将回调注册到会话,但由于已执行Session.refresh(),所以不会执行回调。
  • 因此,与其使用观察者模式,或通过
    run
    块刷新会话状态,还有什么最佳的方法来设计服务等,以便在应用程序的各种其他部分需要之后(或之前)始终刷新会话数据?在执行指令和控制器而不是运行块之前,是否有某种类型的事件可以挂接在一起执行

    如果我的方法总体上是合理的,那么我可以为它添加什么来真正使它按应有的方式工作呢


    谢谢

    在angular.js中,有两种使用全局变量的方法:

  • 使用$rootScope
  • 使用服务
  • 使用$rootScope非常简单,因为您可以简单地将它注入任何控制器并更改此范围中的值。所有全局变量都有问题! 服务是单身(你需要什么)

    我想你可以用

    $rootScope

    $scope.$watch


    很好

    有什么原因不能像这样直接访问变量:

    app.factory('SessionService', function() {
        var items = {
            "avatar": "some url"
        };
        return items;
    });
    
    var MainController = [$scope, 'SessionService', function($scope, SessionService){
        $scope.session = SessionService;
    
        $scope.modifyAvatar = function(url){
            $scope.session.avatar = "some new url";
        };
    }];
    
    var HeaderController = [$scope, 'SessionService', function($scope, SessionService){
        $scope.session = SessionService;
    
        // You probably wouldn't do this, you would just bind
        // to {{session.avatar}} in your template
        $scope.getAvatar = function(){
            return $scope.session.avatar;
        };
    }];
    

    此会话数据是否从服务器加载?当然:)它会生成一个http get on/session,获取所有这些项目。目前它在运行块中执行此操作,但我对其他建议持开放态度。每当应用程序需要再次刷新会话时,它都可以手动调用相同的方法。一般来说,Angular的全部任务是直接访问数据,并让内部
    $digest
    处理其他数据的更新。您的模块可以只访问会话变量本身吗?如果我这样做,应用程序可能会在不同的位置发送4-5个会话数据请求,可能会更多,因为我需要它们,而不是只对所有会话数据发出一个请求。在一个块中获取所有数据不是更好吗?当然,您可以在一个块中更新数据—从db获取数据,将其存储在会话服务中—但之后,您可以让Angular使用其内部脏检查来确定哪些绑定需要更新。对你来说,效率更高,代码更少。使用rootScope不被普遍认为是不好的做法吗?我认为这是最简单的方式,还不错。我以前就有过这样的工作方式,但我认为这可能是不好的做法,因为其他东西可能会与之冲突。如果其他东西覆盖了
    $rootScope.currentTheme
    ,那不是很糟糕吗?在服务后面保护它不是更好吗?您可以使用用户对象的define_getter,并将此对象放入$rootscope中哦,我刚刚意识到。。。你可以看服务功能吗?!我认为它们必须是作用域本身的变量才能观察它们。这可能就是答案。我使用observer模式的原因是一些值实际上是在服务器上添加/计算的,而不是在客户端。因此,在某些情况下,可能会在将会话推送到服务器的同时在本地更新会话,但大部分时间我需要调用
    /session
    ,以获取服务器看到的当前状态,因为否则我只是在复制服务器上的逻辑。。。或者我甚至无法获取新的数据,因为客户没有好的方法来了解它。这是服务器端业务层的东西。在这种情况下,您的会话服务(或其他适当的服务)应该