2016-04-08 17 views
0

は、以下のサービスを使用してデータを共有する& Bは、データ変更のコントローラに通知:コントローラーAは、サービス内のデータを更新は、私は2つのコントローラを持っている

angular.module('data-sharer',[]) 

.factory('datasharer', function() { 
    var sharedData = null; 

    var setSharedData = function (data) { 
    sharedData = data; 
    }; 

    var getSharedData = function() { 
    return sharedData; 
    }; 

    return { 
    setSharedData:setSharedData, 
    getSharedData:getSharedData 
    }; 
}); 

場合、どのように私は、コントローラBに通知することをサービス内のデータが変更されましたか?

私の好みは、$ rootScope & $ broadcastsを使用しないことです。データが変更されたことをすべてのコントローラに伝えるのは少し重いようです。

コールバック関数を使用する方法がありますか?この目的のために

+0

:'リターン{sharedData:sharedData} ' – devqon

答えて

0

あなたはパブ・サブサービスメカニズムを使用することができます。

PUB-SUB:このメカニズムでは、角度の場合、2番目のctrlはいくつかの共通サービスを使用してメソッドを購読します。 1番目のctrlはデータを公開し、2番目のctrlの購読されたメソッド/関数はそれ自身と呼ばれるため、1番目のctrlはいくつかのデータを公開します。

デモはこちらをご覧くださいdemo fiddle

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

myApp.factory('datasharer', function() { 
var sharedData = null; 
var registeredFunc = null; 

var setSharedData = function (data) { 
    registeredFunc(data) 
}; 

var registerForSharedData = function (functionCb) { 
    registeredFunc = functionCb; 
} 

return { 
    setSharedData:setSharedData, 
    getSharedData:getSharedData, 
    registerForSharedData:registerForSharedData 
}; 
}); 

function MyCtrl($scope, datasharer) { 
    $scope.sharedData = datasharer.getSharedData(); 
    $scope.send = function() { 
    datasharer.setSharedData($scope.name);  
    } 
} 

function My2Ctrl($scope, datasharer) { 
    function getSendData(data) { 
    console.log(data); 
    $scope.sharedData = data; 
    } 

datasharer.registerForSharedData(getSendData); 
} 
あなただけの `sharedData`変数を公開することができ、ので、あなたのコントローラの両方が同じインスタンスを指す
+0

まず、コードでメモリリークが発生します.2番目に、私はそのようなサービスが一般的には良いアイデアだと思っています。グローバル変数のように見えます。私は本当にあなたが1ページでこのようなコントローラーのペアをどのように使用するかを見たいと思っています - 2つのサービスを作りますか? –

+0

こんにちはPetrさん、この例ではメモリリークはどこですか? –

0

利用放送は、コントローラから( 'スキャナ起動'、{いずれか:{}})

$ rootScope $放送を放送送信 。コントローラBから

レシーブ放送 $の範囲に$( 'スキャナ起動'、関数(イベント、引数){

var anyThing = args.any; 
// do what you want to do 

})。

0

私は数ヶ月前に同様の問題を抱えていた、私はこれが有用であることが判明:

https://github.com/pviraj/Angular-Service-To-Share-Data-Beween-Controllers

基本的には、コントローラの負荷に呼ばれているゲッターとセッターとのサービス。

+0

正常に動作したときに、あなたのコントローラーを別のページにある場合、または2番目のコントローラーが最初のコントローラーの後にインスタンス化されている場合。私が持っている問題は、私のコントローラの両方が同じページにあることです。ビューAのアイテムをクリックすると、選択したアイテムでビューBを更新する必要があります。 –

+0

@DonalM - あぁそうだよ。さて、放送は完全に動作します。例が必要な場合は、私に知らせてください。彼らは非常に理解しやすいです。 –

0

前述のように、ブロードキャストはこれを意味します。また、前述のように、サービスをデータの中心的なソースとして使用することもできます。

フィドル例:https://jsfiddle.net/gzgkz3cr/

function Service() { 
    var service = { 
    data: { 
     name: 'Rob' 
    } 
    }; 

    return service; 
} 

function ControllerA(Service, $rootScope) { 
    var vm = this; 

    vm.data = angular.copy(Service.data); 
    vm.updateData = updateData; 

    function updateData() { 
    Service.data.name = vm.data.name; 
    $rootScope.$broadcast('data_updated', vm.data); 
    } 
} 

function ControllerB(Service, $scope) { 
    var vm = this; 

    vm.data = Service.data; 

    $scope.$on('data_updated', function(e, data) { 
    alert('new data: ' + data.name); 
    }); 
} 
関連する問題