2016-09-14 18 views
0

私はこの例のように2つの以上のコントローラに/自動同期データを共有できるサービスとします(例から)角度AJAXサービス

app.js

var myApp = angular.module('myApp', []); 


myApp.factory('Data', function(){ 
return { FirstName: '' }; 
}); 

myApp.controller('FirstCtrl', function($scope, Data){ 
$scope.Data = Data; 
}); 

myApp.controller('SecondCtrl', function($scope, Data){ 
$scope.Data = Data; 
}); 

jsFiddle example

さらに、私はajaxでデータをロードする必要があります。私はちょっと試しましたが、ajaxのために、私は約束が必要です(コントローラーはinitの後に変更されたデータを取得しません)。これは、フィドルリンクのような共有オブジェクトで働いていませんでした。可能であれば、イベントなしの解決策が必要です(rootscopeブロードキャスト)

どうすれば両方の技術を併用できますか?あなたは私が何を意味するのか知っていますか? :)

+0

工場で、約束を返すメソッドを作成することができます。そして、両方のコントローラで 'Data.asyncMethod(param1、param2).then(..)'を使います。 。 –

+0

マイコントローラコードは次のようである: 'Data.getBlub()を(関数(応答){; \t $ scope.data =応答});' しかし、他のコントローラは、データを変更した場合、最初の新しいデータを受け取りません。 – Chris

答えて

1
はこれを好きにあなたのサービスを変更し

myApp.factory('Data', function(){ 
    this.name= { FirstName: '' }; 
    return this; 
}); 

コントローラ:

myApp.controller('FirstCtrl', function($scope, Data){ 
    $scope.Data = Data.name; 
}); 

myApp.controller('SecondCtrl', function($scope, Data){ 
    $scope.Data = Data.name; 
}); 
+0

私は角で新しいです、どのように私はその構造に非同期の約束を追加できますか?もし私が 'これを返すなら私は約束を返すことはできません。 (ただし、データを表示するという約束が必要です) – Chris

+0

時間を置いてこのリンクを参照すると、必要なものがすべてあります:https://docs.angularjs.org/api/ng/service/$q理解しようとする –

0

私は多くのことをしようとした今、私のコードは次のとおりです。

angular.module("test").factory("TestFactory", ["$http", function TestFactory($http) { 
    var factory = { 
     data: [], 
     test: 123, 
     getData: function() { 
      $http.get("/blub.json").success(function (result) { 
       factory.data = [1,2,3]; 
      }); 
     }, 
     addToData: function (newData) { 
      factory.data.push(newData); 
     } 
    }; 

    factory.getData(); 

    return factory; 
}]); 

angular.module("test").controller("TestControllerA", ["$scope", "TestFactory", function ($scope, TestFactory) { 
    $scope.factory = TestFactory; 
}]); 

angular.module("test").controller("TestControllerB", ["$scope", "TestFactory", function ($scope, TestFactory) { 
    $scope.factory = TestFactory; 

    setInterval(function() { 
     TestFactory.addToData(TestFactory.data.length + 1); 
     $scope.$apply(); //refresh view/html 
    }, 1000); 
}]); 

私はそこに "悪い "部分とパフォーマーか何かができますか?