AngularJS服务不返回refence而是返回object的值

时间:2017-04-07 09:06:07

标签: javascript angularjs

我发现有时最好使用angularJS服务在两个组件之间进行通信,而不是使用发射/广播技术。我创建了简单的UserService:

(function(){
    angular.module('userService')
        .factory('UserService', userServiceFn);

    userServiceFn.$inject = [];

    function userServiceFn(){
        var user = {
            isLogged: false,
            info: ''
        };
        return {
            setUser: setUser,
            getUser: getUser,
            clearUser: clearUser
        };

        function setUser(info){
            user.isLogged = true;
            user.info = info;
        };
        function getUser(){
            return user;
        };
        function clearUser(){
            user.isLogged = false;
            user.info = {};
        };
    }
})();

然后我可以将此服务注入我需要的当前登录状态var user = UserService.getUser();,例如切换登录按钮&lt; button ng-hide="user.isLogged">login</button>

这项技术的好处在于,当我使用UserService.clearUser()时,将自动显示登录按钮,因为getUser()传递了用户对象的引用,ng-hide绑定了此引用中的更改。

我创建了使用相同技术的MarkerService但有奇怪的行为。 getCoords不会返回coords的引用,而是返回coords的值。

(function(){
    angular.module('app')
        .factory('MarkerService', MarkerServiceFn);
    MarkerServiceFn.$inject = [];
    function MarkerServiceFn(){
        var coords = [
            56.936,
            22.12
        ];
        return {
            setCoords: setCoords,
            getCoords: getCoords
        };
        function setCoords(a){
            console.log(coords);
            coords = a;
            console.log(coords);
        }
        function getCoords(){
            return coords;
        }
    }
})();

Here is a working plunker。令我困惑的是,两种服务都以相同的方式创建,但行为不同。花了两天时间找出这种行为的原因,甚至为这两种服务重复编写了几次代码,但总是遇到同样的问题。

2 个答案:

答案 0 :(得分:2)

在用户服务中,您正在更改对象的属性,而不是替换对象本身。因此,HTML中的引用不会被破坏,您会看到更改。

在坐标服务中,您完全替换了对象,但您的HTML仍然保留对旧对象的引用(该服务现在没有引用)。

您必须将setCoords更改为:

function setCoords(a){
    coords[0] = a[0];
    coords[1] = a[1];
}

答案 1 :(得分:0)

我不确定为什么你的代码不起作用,它是设置值但不在页面上显示新值。但是如果我们使用直接get方法进行绑定就可以了。

Link

我添加了getC函数并将其用于绑定。

ctrl.getC = function(){
    return MarkerService.getCoords();
}
<span ng-bind="$ctrl.getC()"></span>