如何将$ scope对象获取到角度服务

时间:2014-07-28 11:44:28

标签: javascript angularjs angularjs-scope angularjs-service

我有一个我在$rootScope修改的对象,我在那里"存储"我的上一个搜索参数。目前,我有值returnType,行和查询硬编码。我想那些只是$rootScope上的对象的引用。

如何在服务中引用$rootScope上的对象?

angular.module('myApp.services').factory("SearchService", function ($resource) {
    return $resource("/do/search", {}, {
        query: {method: "GET", isArray: false, params: {
            returnType: 'json',
            rows: 25,
            query:'bob*'
        }}
    })

2 个答案:

答案 0 :(得分:1)

如上面的评论中所述,如果您想存储用户的最新数据,那么应该使用服务来完成 - 特别是在LocalStorage中。

我建议按如下方式实施服务:

myApp.factory('localStorageService', function() {
    return {
        get : function (key) {
            return localStorage.getItem(key);
        },
        set : function (key, val) {
            return localStorage.setItem(key, val);
        },
        clearAll : function () {
            localStorage.clear();
        }
    };
};

存储用户最近的搜索数据,例如从Controller中存储:

myApp.controller('homeCtrl', function(localStorageService){
    localStorageService.set('query', 'bob*');
});

并检索它:

localStorageService.get('query');

当然,要完全清除localStorage

localStorageService.clearAll();

如果您愿意,还可以existing module's out there进行localStorage访问,包括后备。

答案 1 :(得分:1)

我不喜欢在localStorage中存储这样的东西。我不想修改上面的答案,因为它完全有效并且代码很好。感谢Ed B在那里做出的贡献。

另一方面,存在安全隐患 - 您在相对容易访问的区域中存储可能敏感的查询文本,这对于图书馆/网吧计算机上的用户来说并不是那么好。大多数人习惯于清除Cookie,但这并不会消除localStorage数据,因此您必须为此提供一种机制,或建议您的所有用户使用"隐身模式" Incognito Mode" Incognito Mode&#34 34 ;?我更喜欢使用localStorage来缓存 app 数据,而不是用户数据,除非你确定它不敏感。

只有你可以决定这是否重要。但由于你最初的问题只是关于如何使用$ rootScope作为倾销场,所以这里是这个特定部分的答案。只需将其注入您的服务/工厂/等:

angular.module('myApp.services').factory("SearchService", function($rootScope, $resource) {
// You now have access to $rootScope here
return $resource("/do/search", {}, {
    query: {method: "GET", isArray: false, params: {
        returnType: 'json',
        rows: 25,
        query: $rootScope.query
    }}
});

一些快速评论:

  1. 为什么称它为服务并将其作为工厂? :)实际上并没有效率差异,如果你真的把它作为一个完整的服务,代码可能会更简单。

  2. 如果您将其作为真正的服务,您可能不再需要$ rootScope。使用服务,您可以创建一个可以从其他地方调用的方法......然后您可以直接从调用者接受参数。因此调用者可以将数据直接发送到搜索功能,然后处理其结果。简单!