使用服务作为模型

时间:2016-01-24 07:39:20

标签: angularjs service model private implementation

我希望这项服务能够像模型一样运作。

appState.set('name', 'SJV');
appState.get('name');

几个问题。

1 - 最初启动应用程序并访问此道具时,默认属性是未定义的。为什么会这样?

2 - 这是一个简单但正确的将服务作为模型处理并存储可在整个应用程序中访问的数据吗?

3 - 我假设只返回一个get / set API,其余的属性不能直接访问(类似私有),但它们不是。有人可以解释为什么会这样吗?

一旦注入Controller,我按如下方式设置并获取属性值,效果很好。

import com.google.api.services.admin.directory.DirectoryScopes;
import com.google.api.services.admin.directory.model.*;
import com.google.api.services.admin.directory.Directory;

一般问题:什么是一个可靠而正确的实施。我想保持简单,平易近人。

2 个答案:

答案 0 :(得分:1)

此引用指的是您的服务创建功能,而不是您要返回的对象。这是一个修复的例子。

var result = {};
result.currentAnswerset = 1;
result.currentQuestion = 2;
result.name;

function set(key, value) {
    console.log('>> set appStateModel', key, value);
    var localVar = key;
    result[localVar] = value;
}

function get(key) {
    console.log('<< get appStateModel', key, result[key]);
    return result[key];
}

result.get = get;
result.set = set;
return result;

答案 1 :(得分:1)

问题1

.service()需要一个构造函数。哪个Angular使用new运算符进行实例化。因此,您不需要返回新对象。 JavaScript为您返回对象。现在,在服务构造函数中,您可以将公共函数添加到this变量。

angular
    .module('secrunApp')
    .service('appState', function () {
        this.currentAnswerset = 1;
        this.currentQuestion = 2;
        this.name;

        this.set = function (key, value) {
            console.log('>> set appStateModel', key, value);
            var localVar = key;
            this[localVar] = value;
        };

        this.get = function (key) {
            console.log('<< get appStateModel', key, this[key]);
            return this[key];
        };
    });

现在,您的服务实例是对服务构造函数中this引用的同一对象的引用。但由于您的数据与服务对象本身相关联,因此它们不是私有的。我们稍后再回过头来看。

问题2

您可以尝试在DOM中使用更高的基本控制器,以处理所有应用级视图模型。 E.g。

<body ng-controller="AppController as appVm">
  <div ng-controller="SomethingController as somethingVm">
    <p>{{ appVm.currentAnswerset }}</p>
  </div>
</body>

问题3

要保持变量私有,请在服务构造函数中定义一个局部变量,只有getter和setter可以通过闭包访问。

angular
    .module('secrunApp')
    .service('appState', function () {
        // Private data only getter and setter can access
        var data = {
            currentAnswerset: 1,
            currentQuestion: 2,
            name: ''
        };

        this.set = function (key, value) {
            data[key] = value;
        };

        this.get = function (key) {
            return data[key];
        };
    });