2014-10-06 3 views
1

Я хочу обмениваться данными между контроллерами:Обмен данными с контроллерами между с завода, AngularJS

<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-rc.4/angular.min.js"></script> 
<script> 
var myApp = angular.module('myApp',[]); 
myApp.factory('Data', function(){ 
    return {show: true, text: "Hello"}; 
}); 

myApp.controller('ctrl1', ['$scope', 'Data', function($scope, Data) { 
    $scope.data = Data; 
}]); 

myApp.controller('ctrl2', ['$scope', 'Data', function($scope, Data) { 
    $scope.click = function(){ 
     Data = {text:"Hello2", show:true}; 
    } 
}]); 
</script> 
<body ng-app='myApp'> 
<div style="background-color:red;margin-top:30px;" ng-controller="ctrl1"> 
    {{data.text}} 
</div> 
<div style="background-color:yellow;margin-top:30px;" ng-click="click()" ng-controller="ctrl2"> 
    Click to change data 
</div> 
</body> 

Demo http://plnkr.co/edit/QHuWLYjBqDvl20fL7eeu?p=preview. Это не работает, однако, если я пишу

Data.text = 'Hello2'; 
Data.show = true; 

Он отлично работает. Демо http://plnkr.co/edit/xKtLUlBu0dQPUsiNCRyC?p=preview

Было бы очень полезно просто обновить модель, просто указав Json, как я могу это сделать?

+0

Я боюсь, что вы связаны же plnkr в обоих случаи – maurycy

+0

@maurycy Извините, исправлено сейчас, я думаю – user1506145

ответ

1

Выполняя Data = {text:"Hello2", show:true};, вы полностью перезаписываете начальный объект Data, что приводит к нарушению ссылки. Вот почему вы не можете просто назначить совершенно новый объект. Вы, однако, можете сделать это что-то вроде этого:

myApp.factory('Data', function(){ 
    return { 
     prop: {show: true, text: "Hello"} 
    }; 
}); 

и позже:

Data.prop = {text: "Hello2", show: true}; 
+0

Отличная мысль, но кажется, что она не работает ни http://plnkr.co/edit/gYChWzfQ2DkwKCOuL5Zw?p=preview – user1506145

+0

http://plnkr.co/edit/ZH2UKazOzogeFrJVZdLp ? p = preview При записи '$ scope.data = Data.prop;' вы еще раз отсоединяете '$ scope.data' от' Data.prop'. Однако это должно быть '$ scope.data = Data'. – dfsq

+0

О, я вижу, теперь я понимаю, thx :) – user1506145

1

Когда вы пишете

Data = {text:"Hello2", show:true}; 

Вы перезаписаны локальную Data переменных с новым локальным объектом

При написании

Data.text = 'Hello2'; 
Data.show = true; 

оригинальный объект, который также связан в родительских областях остается, вы перезаписать переменные внутри Data объекта, а не просто переписав локальный Data ссылку на объект

Смежные вопросы