我有一个我在$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*'
}}
})
答案 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
}}
});
一些快速评论:
为什么称它为服务并将其作为工厂? :)实际上并没有效率差异,如果你真的把它作为一个完整的服务,代码可能会更简单。
如果您将其作为真正的服务,您可能不再需要$ rootScope。使用服务,您可以创建一个可以从其他地方调用的方法......然后您可以直接从调用者接受参数。因此调用者可以将数据直接发送到搜索功能,然后处理其结果。简单!