首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Getter/Setter方法在AngularJS工厂中的应用

Getter/Setter方法在AngularJS工厂中的应用
EN

Stack Overflow用户
提问于 2015-03-19 16:53:52
回答 2查看 6.5K关注 0票数 4

我遇到了一些主要的头痛,试图为我的一个角模块创建工厂。我需要获取一些JSON数据,并且能够在保留原始格式的同时使用它,这样我就可以将其转换为字符串。因此,如果我有JSON数据,如:

代码语言:javascript
运行
复制
[ [ '11/09/2012', {gender:'M'}, 'John', 'Smith'], ['07/22/1986', {gender:'M'}, 'Bill', 'Miller], ...]

我希望能够调用data.birthday或data.firstName,而不是在我看来必须跟踪结构。

为了做到这一点,我有一家工厂,看起来是这样的:

代码语言:javascript
运行
复制
.factory('DataObject', function () {

        DataObject.prototype.objToArray = function()
        {
            var arrayVal = [];

            arrayVal[0] = this.bday;
            arrayVal[1] = this.phys;
            arrayVal[2] = this.fname;
            arrayVal[3] = this.lname;               
            return arrayVal;
        };

        function DataObject(data, valueBuilder) {
            if(data)
            {
                this.bday = data[0];
                this.phys = data[1];
                this.fname = data[2];                   
                this.lname = data[3];
            }
        }
        return (DataObject);
    })

那部分运作得很好。问题是,我还想添加角访问器方法,以便获得/设置嵌套值,比如性别。类似于:

代码语言:javascript
运行
复制
get gender(){ return this.phys.gender; }

我不知道如何在我的工厂中使用那个语法。它允许我使用访问器方法的唯一方法是更改

代码语言:javascript
运行
复制
function DataObject(data, valueBuilder) {}
return DataObject;

代码语言:javascript
运行
复制
return { get gender(), set gender(val)};

这意味着我无法使用数据实例化我的工厂。我相信一定有办法的。我遗漏了什么?

EN

回答 2

Stack Overflow用户

发布于 2015-11-28 10:05:45

这里是一个角的设置器和getter示例。在setter中,我附加了一些额外的字符串Mr和getter :

代码语言:javascript
运行
复制
var myApp = angular.module('myApp', []);

myApp.service('userService', [function () {
    var first_name, last_name;
    this.user = {
        get name() {
            return ':' + first_name;
        },
        set name(val) {
            first_name = 'Mr ' + val;
        }
    };
    return this.user;
}]);

myApp.controller('testCtrl', ['$scope', 'userService', function ($scope, userService) {
    userService.name = 'Been';
    
    $scope.test = userService;
    
}]);
代码语言:javascript
运行
复制
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="myApp">
<h2>Test Controller</h2>
    <div class="wrapper" ng-controller="testCtrl">
        My Name {{test.name}}
    </div>
</div>

票数 3
EN

Stack Overflow用户

发布于 2015-03-19 18:33:03

我不确定这是不是你想要的?但实际上,我正在返回一个可以修改的对象的新实例。由于工厂是单个的,所以您需要返回一个可以单独修改的实例。

这里有一把小提琴:

https://jsfiddle.net/1bejzxwq/

代码语言:javascript
运行
复制
angular.module('HelloApp', [])
    .factory('DataObjectFactory', [DataObjectFactory])
    .controller('Test', ['$scope', 'DataObjectFactory', Test]);


function Test ($scope, DataObjectFactory) {
    $scope.hi = "hi";

    var data = [ '11/09/2012', {gender:'M'}, 'John', 'Smith'];
    var object = DataObjectFactory.DataObject(data);
    console.log(object.getFirstName());
}

function DataObjectFactory () {

    var service = {
        DataObject: function (data) {
            return new DataObject(data);
        }
    };

    return service;

    function DataObject(data) {
        if(data) {
            this.bday = data[0];
            this.phys = data[1];
            this.fname = data[2];                   
            this.lname = data[3];
        }

        this.getFirstName = function () {
            return this.fname || null;
        }
    }
}

也许可以看看这个答案中的例子(备选案文2):

Angular.js data accessor

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29150521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档