从 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 实例。