2015-09-18 17 views
5

コントローラ1からコントローラ2にオブジェクトで満たされた配列を送信しようとしていますが、コントローラ2に入るのは空の配列です。私が満たしたものを得る唯一の方法は、私のサービスで静的な配列を作成するときです。データを設定しますコントローラ間でデータを共有するAngularJS

マイサービス

app.service('myData', function() { 
this.myData = []; 

this.addData = function(data) { 
    this.myData.push(data); 
} 
this.getData = function() { 
    return this.myData; 
}}); 

コントローラ1

app.controller('controller1',['$scope', 'myData', function($scope, myData) { 
    $scope.addData = function(index, name) { 
     myData.addData({index: index, name: name}); 
    }}]); 

私は質問の多くを発見した答えを探していたときコントローラ2は、この

app.controller('controller2',['$scope', 'myData', function($scope, myData) { 

$scope.myData = myData.getData(); 
$scope.$watch('myData.getData()', function(data){ 
    console.log(data); 
}); 
console.log($scope.myData);}]); 

のように見えますほとんど私に似ています。唯一の違いは、静的なサービスを作成するのではなく、私のコントローラから私のサービスを満たすことでした。

私の両方のconsole.logsは空の配列を返します。どうしてこれなの?

+0

あなたがルートスコープまたはのいずれかを使用する必要がありますブロードキャストやイベントのようなコミュニケーション機構 – Rafa

+0

あなたの時計は私にとって少し奇妙なようです。 'data.getData()'の代わりに 'function(){return myData.getData()}'を実行してください –

答えて

1

$watchの式は、関数(see the docs for $watch)である必要があります。 $watchに文字列を指定すると、$scopeのプロパティを検査するようにAngularに指示します。これと同様に、サービスを文字列'data.getData()'の 'data'として誤って参照しています。

1)myData#getDataの結果を見る:

$scope.$watch(function() { 
    return myData.getData(); 
}, function (data) { 
    console.log(data); 
}); 

2)$scopemyDataサービスの内部配列への参照を見る:

$scope.myData = myData.getData(); 
$scope.$watch('myData', function (data) { 
    console.log(data); 
}); 
0

あなたからaddDataを呼び出す場合、それが動作するはずです例えば、第1コントローラ:

JSFiddle

.controller('tourCtrl', ['$scope', 'myData', function ($scope, myData) { 
    $scope.addData = function (index, name) { 
     myData.addData({ 
      index: index, 
      name: name 
     }); 
    } 
    $scope.addData('hello', 'world'); 
}]) 
.controller('controller2', ['$scope', 'myData', function ($scope, myData) { 

    $scope.myData = myData.getData(); 
    $scope.$watch('myData', function (data) { 
     console.log(data); 
    }); 
    console.log($scope.myData); 
}]); 
0

私はpubsubメカニズムのようなものを使用することをお勧めします。データがいつ表示されるかはわかりません。機能の監視は高価な操作です。あなたのサービスでPubSubのメカニズムを構築することができます。

コントローラーがイベントに登録し、別のコントローラーがそのイベントを公開する可能性があります。最低限のリソースで、あなたが望むものを達成することができます。ここ

は別のアプローチは、Observerパターンを用いることであろうサンプル

app.factory('pubSubService', [function() { 
var pubSubAPI = {}; 
var hooks = []; 

pubSubAPI.publishEvent = function(message) { 
    for (var i = 0; i < hooks.length; i++) { 
     hooks[i](message); 
    } 
}; 

pubSubAPI.subscribeEvent = function(eventFunction) { 

    hooks.push(eventFunction); 
}; 

return pubSubAPI; 
}]); 
+0

[このタイプの機能は既にAngularで利用可能です。](http://toddmotto.com/all-about-angulars -emit-broadcast-on-publish-subscribing /)を実行します。 – sdgluck

+2

はい、anglejs上のこのタイプの機能はスコープ用です。私が常に避けようとしているrootScopeを使用したい場合を除きます。あなたはこの問題で角度機能を使用することはできません – bahadir

0

で、まったく$watchを使う必要がなくなります。

app.service('myData', function() { 
    this.myData = []; 
    var observers = []; 
    var self = this; 

    this.addObserver = function (callback) { 
     observers.push(callback); 
    }; 

    var notifyObservers = function() { 
     angular.forEach(observers, function (callback) { 
      callback(self.myData); 
     }); 
    }; 


    this.addData = function (data) { 
     this.myData.push(data); 
     notifyObservers(); 

    } 
}); 


app.controller('controller2', ['$scope', 'myData', function ($scope, myData) { 

    myData.registerObserverCallback(function (data) { 
     $scope.myData = data; 
     console.log(data); 
    }); 
}]); 
関連する問題