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

时间:2015-11-24 13:18:18

标签: javascript angularjs angularjs-service

我真的很感激一些反馈如何运作?我有一个服务,我存储一些会话特定的变量,如表排序选择等。

代码似乎工作正常。但是,我的问题是 - 如何在不返回实际变量的情况下检索这些值?

我不应该使用某种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;
  }

});

然后我们有控制器。

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中的结果相同。

2 个答案:

答案 0 :(得分:2)

服务就是所谓的“单身人士”,这意味着您可以设置一个不能直接访问或返回的变量,并且如果是UI,它将维护它的生命值。在这种情况下,如果您希望能够访问sessionService.searchView,您可以通过以下几种方式实现:

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

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

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

var searchView;

return {
    setSearchView: setSearchView,
    searchView: searchView
};

答案 1 :(得分:1)

将服务注入控制器

angular.module('myApp').controller('SearchCtrl', function (sessionService) {

为您提供服务定义功能的实例。换句话说,您的sessionService基本上是

new function () {

  return {
    setSearchView: setSearchView
  };

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

}

,即您定义以new开头的服务时传入的函数。 new 表示您只是将其用作构造函数。

现在,我们对 new 和Javascript构造函数有什么了解 - 只是如果构造函数返回一个对象,那就是new的左侧设置为什么。成员方法中的this基本上是指同一个对象。

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

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

var sessionService = new SessionService();

请注意,我将SessionService大写以表明它是构造函数,并且sessionService处于驼峰状态,因为它是一个实例。

考虑到这一点,当你这样做时

sessionService.setSearchView(1);

您要将searchView实例的sessionService属性设置为1.当您执行

sessionService.searchView

这是您正在访问的完全相同的属性,您将获得您设置的值。

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