我发现有时最好使用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。令我困惑的是,两种服务都以相同的方式创建,但行为不同。花了两天时间找出这种行为的原因,甚至为这两种服务重复编写了几次代码,但总是遇到同样的问题。
答案 0 :(得分:2)
在用户服务中,您正在更改对象的属性,而不是替换对象本身。因此,HTML中的引用不会被破坏,您会看到更改。
在坐标服务中,您完全替换了对象,但您的HTML仍然保留对旧对象的引用(该服务现在没有引用)。
您必须将setCoords
更改为:
function setCoords(a){
coords[0] = a[0];
coords[1] = a[1];
}
答案 1 :(得分:0)
我不确定为什么你的代码不起作用,它是设置值但不在页面上显示新值。但是如果我们使用直接get方法进行绑定就可以了。
我添加了getC函数并将其用于绑定。
ctrl.getC = function(){
return MarkerService.getCoords();
}
<span ng-bind="$ctrl.getC()"></span>