Javascript 从AngularJS服务中检索值而不返回它们?

Javascript 从AngularJS服务中检索值而不返回它们?,javascript,angularjs,angularjs-service,Javascript,Angularjs,Angularjs Service,我真的很想知道这是怎么回事?我有一个服务,其中存储了一些特定于会话的变量,如表排序选项等 代码似乎运行良好。然而,我的问题是-我如何能够在不返回实际变量的情况下检索这些值 我不应该使用某种Getter函数吗?它们是通过setter方法公开的,还是我在这里做了一些完全错误的事情?使用这个是某种罪魁祸首吗?或者仅仅是我对javascript作用域的理解不够?:) 服务代码: angular.module('myApp').service('sessionService', function () {

我真的很想知道这是怎么回事?我有一个服务,其中存储了一些特定于会话的变量,如表排序选项等

代码似乎运行良好。然而,我的问题是-我如何能够在不返回实际变量的情况下检索这些值

我不应该使用某种Getter函数吗?它们是通过setter方法公开的,还是我在这里做了一些完全错误的事情?使用这个是某种罪魁祸首吗?或者仅仅是我对javascript作用域的理解不够?:)

服务代码:

angular.module('myApp').service('sessionService', function () {

  this.searchView = 2; // <-- edited in, forgot this

  return {
    setSearchView: setSearchView
  };

  function setSearchView (searchView) {
    this.searchView = searchView;
  }

});
例如,一旦我从控制器设置了searchView,就可以按如下方式访问它

任何能帮助我理解这一点的都将不胜感激


编辑:我忘了添加这一点。searchView实际上从一开始就存在,但在控制器的console.log中的结果是相同的。

服务被称为“单例”,这意味着您可以设置一个不可直接访问或返回的变量,如果用户界面不可用,它将在整个生命周期内保持其值。在这种情况下,如果您不想访问sessionService.searchView,可以通过以下几种方式:

1) 设置私有var searchView,然后向return语句添加getter函数:

  return {
    setSearchView: setSearchView,
    getSearchView: function() {
        return searchView;
    }
  };
var searchView;

return {
    setSearchView: setSearchView,
    searchView: searchView
};
2) 创建相同的私有变量,然后将其添加到return语句中:

  return {
    setSearchView: setSearchView,
    getSearchView: function() {
        return searchView;
    }
  };
var searchView;

return {
    setSearchView: setSearchView,
    searchView: searchView
};

当您将服务注入控制器时

angular.module('myApp').controller('SearchCtrl', function (sessionService) {
您将获得服务定义功能的实例。换句话说,您的
会话服务基本上是

new function () {

  return {
    setSearchView: setSearchView
  };

  function setSearchView (searchView) {
    this.searchView = searchView;
  }

}
i、 e在定义服务之前加上new时传入的函数。新的
表示您只是将其用作构造函数


现在,关于new和Javascript构造函数,我们知道些什么——只要构造函数返回一个对象,new的左边就是这样设置的。成员方法中的这个
基本上是指同一个对象

简而言之,您的服务定义是一个构造函数。在纯Javascript中,它看起来像这样

function SessionService () {
  return {
    setSearchView: function (searchView) {
       this.searchView = searchView;
    }
  };
}

var sessionService = new SessionService();
注意,我用大写字母
SessionService
表示它是一个构造函数,
SessionService
是驼峰式的,因为它是一个实例


记住这一点,当你这样做的时候

sessionService.setSearchView(1);
sessionService.searchView
您正在将
sessionService
实例的
searchView
属性设置为1。当你这么做的时候

sessionService.setSearchView(1);
sessionService.searchView
这与您正在访问的属性完全相同,您可以获得设置的值


您还可以执行sessionService.searchView=1,它也可以工作,因为您所做的只是处理sessionService实例。

该服务没有名为
searchView
的属性,直到您将其设置为已定义的公共属性。如果希望它是私有的,则必须使用变量,以便将其作用域限定到该函数,并使用getter/setter方法。当服务初始化时,searchView未定义,只有在使用SetSearchView后才能获取其值谢谢您的回答,请参阅我的编辑。this.searchView=2;从一开始就在那里。这有什么不同吗?谢谢你给我一个很好的答案,不过我确实有一个this.searchView=2;从一开始,这不应该是一个属性吗?如果您没有从服务定义函数返回任何内容,它应该是属性(去掉return语句,您就会看到它工作了-您必须删除setSearchView调用,以便控制器不会出错)。检查-发生的是第4点。-新创建的对象(第一行中设置this.searchView的对象)将替换为返回的非基本对象.hm。。实际上,我的意思是删除返回,就像这样-。最初,实际返回的是您返回的内容(抱歉,如果这听起来很混乱:-)-即一个只有一个成员函数setSearchView的文本对象。调用(对象的)setSearchView时,它会依次设置对象的属性searchView。您的第一个this.searchView=2没有影响,因为
this
引用了一个单独的对象,它被丢弃,取而代之的是前面提到的文本对象(因为您在构造函数中执行了一个返回)。是的,这正是发生的事情!如果你想找深入的东西,这本书很不错。