2013-08-28 44 views
2

我有一个注入到我的控制器中的服务。该服务定义了许多功能。angularjs:使用服务在控制器之间进行通信

现在我想添加一个变量,该服务将在应用程序中保存selectedItem。我已经做到了这种方式:

angular.module('myservices', []). 
factory('serviceA', function() {   

    var serviceA= { 
     selectedItem: selectedItem,  
     ... more functions here 
    }; 
    return serviceA; 

    var selectedItem; 
    ... functions go here 
}); 

在我的控制器之一,我设置所选项目:

serviceA.selectedItem = someItem; 

和另一个控制器的视图引用这样选择的项目:

<span>{{serviceA.selectedItem.value}}</span> 

即使selectedItem设置正确,跨度永远不会更新。我究竟做错了什么 ?

+0

我分叉这拨弄几个时间前到控制器之间的通信工作: http://jsfiddle.net/patxy/RAVFM/(抱歉,我不记得是谁第一个做的)。 这个小提琴使用一个事件来做到这一点($ scope.broadcast)。我建议你保持服务,并将此事件引入此服务 –

+0

我想避免使用广播。事实上,angularjs中的服务是单例的,这就是为什么我想将它用于跨控制器的共享变量。我只使用广播并发出指令 – Sam

回答

7

访问该服务在你看来,你需要将其分配到的范围:

$scope.serviceA = serviceA;

http://jsfiddle.net/MzJsZ/

+1

这很好。我也更新了演示来检查我自己。 http://jsfiddle.net/MzJsZ/1/ – codef0rmer

+0

我已经发布了我自己的答案在你面前。但我会接受你的。 Thansk帮忙! – Sam

1
angular.module('myservices', []).factory('serviceA', function() {   
    return { 

////工厂返回一个对象

 var serviceA= { 
     selectedItem: selectedItem,  
     ... more functions here 
    }; 
    return serviceA; 

    var selectedItem; 
    ... functions go here 

} 

}); 

工作的呢?你错过了返回部分,那里的一切都在那里。如果你会使用服务,你只会写this.serviceA = {...}

而你的代码在控制器中缺少$ scope!

$scope.someItem= serviceA.selectedItem; 

或(我真的不知道自己想要什么)你的跨度

<span>{{someItem.value}}</span> 

$scope.serviceA.selectedItem= someItem;

然后(我真的不知道自己想要什么)<span>{{serviceA.selectedItem.value}}</span>

PS我不喜欢你的控制器名称与对象的一样 - serviceA;

+0

我从来不这样做,是否需要?我的代码工作正常,没有它,我可以从控制器调用像'serviceA.someFunction()'这样的函数。这只是为了selectedItem变量,我有一个问题。 – Sam

+0

感谢您的编辑。看到我的答案,因为它是我需要添加到范围内的服务本身。这样,我可以将视图直接绑定到服务变量,这个变量在控制器之间共享,即:如果一个控制器修改该值,属于另一个控制器的视图将自动显示更改。不要担心名字,我已经改变了它们,但是在我的真实代码中,它们的命名方式不同。感谢您的帮助! – Sam

0

啊!我得到它的工作!

这样做:

<span>{{serviceA.selectedItem.value}}</span> 
的观点,因为虽然serviceA在视图中的控制器注入,我没有把它分配给范围将无法正常工作

...所以正确的方法是做到这一点的控制器:

angular.module('controllers').controller('someCtrl', 
['$scope', 'directDebitService', function ($scope, serviceA) { 
    $scope.serviceA= serviceA; 
}]); 

现在工作正常。

相关问题