Une solution simple est d'avoir votre usine de retour d'un objet et laissez vos contrôleurs de travailler avec une référence au même objet:
JS:
myApp.factory('Data', function () {
return { FirstName: '' };
});
myApp.controller('FirstCtrl', function ($scope, Data) {
$scope.Data = Data;
});
myApp.controller('SecondCtrl', function ($scope, Data) {
$scope.Data = Data;
});
HTML:
<div ng-controller="FirstCtrl">
<input type="text" ng-model="Data.FirstName">
<br>Input is : <strong>{{Data.FirstName}}</strong>
</div>
<hr>
<div ng-controller="SecondCtrl">
Input should also be here: {{Data.FirstName}}
</div>
Démo: http://jsfiddle.net/HEdJF/
Lorsque les applications sont de plus en plus, plus complexe et plus difficile à tester, vous ne voulez pas vous exposer l'ensemble de l'objet de l'usine, de cette manière, mais au lieu de donner un accès limité, par exemple via des accesseurs et mutateurs:
myApp.factory('Data', function () {
var data = {
FirstName: ''
};
return {
getFirstName: function () {
return data.FirstName;
},
setFirstName: function (firstName) {
data.FirstName = firstName;
}
};
});
Avec cette approche, il est jusqu'à la consommation des contrôleurs de mise à jour de l'usine avec de nouvelles valeurs, et à l'affût de changements pour les obtenir:
myApp.controller('FirstCtrl', function ($scope, Data) {
$scope.firstName = '';
$scope.$watch('firstName', function (newValue) {
if (newValue) Data.setFirstName(newValue);
});
});
myApp.controller('SecondCtrl', function ($scope, Data) {
$scope.$watch(function () { return Data.getFirstName(); }, function (newValue) {
if (newValue) $scope.firstName = newValue;
});
});
Démo: http://jsfiddle.net/5LL3U/2/