从 AngularJS 服务中检索值而不返回它们?
Retrieving values from AngularJS service without returning them?
如果能提供一些有关其工作原理的反馈,我将不胜感激?我有一项服务,我在其中存储了一些特定于会话的变量,例如 table 排序选项等等。
代码似乎工作正常。但是,我的问题是 - 我怎么可能在不返回实际变量的情况下检索这些值?
我不应该使用某种 Getter 函数吗?他们是用 setter 方法制作了 public 某种方式,还是我在这里做错了什么?使用 this 是某种罪魁祸首吗?或者仅仅是我对 javascript 范围界定缺乏了解? :)
服务代码:
angular.module('myApp').service('sessionService', function () {
this.searchView = 2; // <-- edited in, forgot this
return {
setSearchView: setSearchView
};
function setSearchView (searchView) {
this.searchView = searchView;
}
});
然后是控制器。
angular.module('myApp').controller('SearchCtrl', function (sessionService) {
console.log(sessionService.searchView); //undefined
sessionService.setSearchView(1);
console.log(sessionService.searchView); // 1
});
一旦我从控制器设置了 searchView,就可以按如下方式访问它。
任何可以帮助我理解这一点的东西都将不胜感激。
编辑:我忘了补充说 this.searchView 实际上是从一开始就存在的,尽管在控制器中 console.log 的结果相同。
服务就是所谓的 'singletons',这意味着您可以设置一个不可直接访问或 returned 的变量,如果 UI,它将终身保持其值。在这种情况下,如果您希望能够访问 sessionService.searchView,您可以通过以下几种方式实现:
1) 设置一个私有变量 searchView,然后将一个 getter 函数添加到您的 return 语句中:
return {
setSearchView: setSearchView,
getSearchView: function() {
return searchView;
}
};
2) 创建相同的私有变量,然后将其添加到您的 return 语句中:
var searchView;
return {
setSearchView: setSearchView,
searchView: searchView
};
当您将服务注入控制器时
angular.module('myApp').controller('SearchCtrl', function (sessionService) {
您获得了服务定义函数的实例。换句话说,你的 sessionService
基本上是
new function () {
return {
setSearchView: setSearchView
};
function setSearchView (searchView) {
this.searchView = searchView;
}
}
即你定义服务时传入的函数,前面加了new。 new 意味着您只是将它用作构造函数。
现在,我们对 new 和 Javascript 构造函数了解多少 - 只是如果构造函数函数 returns 一个对象,那就是左手新的一面被设置为。成员方法中的 this
基本上指的是同一个对象。
简而言之,您的服务定义是一个构造函数。在普通的 Javascript 中,它看起来像这样。
function SessionService () {
return {
setSearchView: function (searchView) {
this.searchView = searchView;
}
};
}
var sessionService = new SessionService();
请注意,我将 SessionService
大写表示它是一个构造函数,而 sessionService
是驼峰式的,因为它是一个实例。
考虑到这一点,当您
sessionService.setSearchView(1);
您正在将 sessionService
实例的 searchView
属性 设置为 1。当您执行
sessionService.searchView
这与您正在访问的 属性 完全相同,并且您获得了您设置的值。
您也可以执行 sessionService.searchView
= 1,它也可以正常工作,因为您所做的只是处理 sessionService 实例。
如果能提供一些有关其工作原理的反馈,我将不胜感激?我有一项服务,我在其中存储了一些特定于会话的变量,例如 table 排序选项等等。
代码似乎工作正常。但是,我的问题是 - 我怎么可能在不返回实际变量的情况下检索这些值?
我不应该使用某种 Getter 函数吗?他们是用 setter 方法制作了 public 某种方式,还是我在这里做错了什么?使用 this 是某种罪魁祸首吗?或者仅仅是我对 javascript 范围界定缺乏了解? :)
服务代码:
angular.module('myApp').service('sessionService', function () {
this.searchView = 2; // <-- edited in, forgot this
return {
setSearchView: setSearchView
};
function setSearchView (searchView) {
this.searchView = searchView;
}
});
然后是控制器。
angular.module('myApp').controller('SearchCtrl', function (sessionService) {
console.log(sessionService.searchView); //undefined
sessionService.setSearchView(1);
console.log(sessionService.searchView); // 1
});
一旦我从控制器设置了 searchView,就可以按如下方式访问它。
任何可以帮助我理解这一点的东西都将不胜感激。
编辑:我忘了补充说 this.searchView 实际上是从一开始就存在的,尽管在控制器中 console.log 的结果相同。
服务就是所谓的 'singletons',这意味着您可以设置一个不可直接访问或 returned 的变量,如果 UI,它将终身保持其值。在这种情况下,如果您希望能够访问 sessionService.searchView,您可以通过以下几种方式实现:
1) 设置一个私有变量 searchView,然后将一个 getter 函数添加到您的 return 语句中:
return {
setSearchView: setSearchView,
getSearchView: function() {
return searchView;
}
};
2) 创建相同的私有变量,然后将其添加到您的 return 语句中:
var searchView;
return {
setSearchView: setSearchView,
searchView: searchView
};
当您将服务注入控制器时
angular.module('myApp').controller('SearchCtrl', function (sessionService) {
您获得了服务定义函数的实例。换句话说,你的 sessionService
基本上是
new function () {
return {
setSearchView: setSearchView
};
function setSearchView (searchView) {
this.searchView = searchView;
}
}
即你定义服务时传入的函数,前面加了new。 new 意味着您只是将它用作构造函数。
现在,我们对 new 和 Javascript 构造函数了解多少 - 只是如果构造函数函数 returns 一个对象,那就是左手新的一面被设置为。成员方法中的 this
基本上指的是同一个对象。
简而言之,您的服务定义是一个构造函数。在普通的 Javascript 中,它看起来像这样。
function SessionService () {
return {
setSearchView: function (searchView) {
this.searchView = searchView;
}
};
}
var sessionService = new SessionService();
请注意,我将 SessionService
大写表示它是一个构造函数,而 sessionService
是驼峰式的,因为它是一个实例。
考虑到这一点,当您
sessionService.setSearchView(1);
您正在将 sessionService
实例的 searchView
属性 设置为 1。当您执行
sessionService.searchView
这与您正在访问的 属性 完全相同,并且您获得了您设置的值。
您也可以执行 sessionService.searchView
= 1,它也可以正常工作,因为您所做的只是处理 sessionService 实例。