只读服务中的物业

时间:2015-09-22 04:59:02

标签: javascript angularjs

我有一个缓存服务,我想在其中存储数据。

angular.module('core').service('markerCache', function(){
    var cache = [];
    this.set_cache = function(arr){
        cache = arr;
        this.cached = true;
    };
    this.cached = false; //this must be read-only and must be property, not function
});

如果可能的话,我还想在角度服务(工厂,服务)中定义只读(值只能在服务内设置)属性,否则 - 任何解决方法都会很棒。
There is一种在javascript中定义只读属性的方法,但是如何以角度方式进行定义? 通过只读我的意思是在服务内设置值。例如

angular.module('core').controller('Ctrl', function($scope, markerCache){
    markerCache.cached = false; //disable setter outside of markerCache service
});

更新,对于仍然感兴趣的人,这里的工作服务

angular.module('core').service('markerCache', function(){
    var cache = [];
    var cached = false;
    Object.defineProperty(this, "cache", {
        get: function() {
            return cache;
        },
        set: function(val){
            cache = val;
            cached = true;
        }
    });
    Object.defineProperty(this, "cached", {
        get: function() {
            return cached;
        },
        set: angular.noop
    });
});

3 个答案:

答案 0 :(得分:4)

您可以使用闭包来隐藏变量并使用Object.defineProperty公开属性来读取变量。

angular.module('core').service('markerCache', function(){
    var cache = [];
    var cached = false; // private variable
    this.set_cache = function(arr){
        cache = arr;
        cached = true;
    };
    Object.defineProperty(this, "cached", { // public readonly getter
      get: function() {
        return cached;
      },
      set: function(val) {
        //throw new Error('Cannot set internal cache state'); //throw custom exception
      }
      //set: angular.noop //or do nothing, empty setter
    })
});

答案 1 :(得分:0)

您在寻找AngularJS constants吗?

  

常量(名称,值);注册一个常量服务,例如字符串,   $ injector,数字,数组,对象或函数。   与值不同,它可以注入模块配置功能   (参见angular.Module)并且它不能被Angular覆盖   装饰器。

答案 2 :(得分:0)

该变量不应与this上下文相关联,您可以将其变为私有var cached,并在服务中定义getter以获取cache的值这样消费者就可以通过getter函数访问该值。

angular.module('core').service('markerCache', function(){
    var cache = [], 
        cached = false; //made privet
    this.set_cache = function(arr){
        cache = arr;
        cached = true;
    };
    this.getCache = function(){
        return cached;
    }
});