2015-09-18 22 views
5

Sto provando a inviare un array pieno di oggetti dal controller 1 al controller 2. Ma tutto ciò che ottengo nel controller 2 è un array vuoto. L'unico modo per ottenerne uno pieno è quando creo un array statico nel mio servizio.Condivisione dei dati tra i controller AngularJS

Il mio servizio

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

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

regolatore 1, che imposta i dati

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

controller 2 si presenta così

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);}]); 

Quando ero alla ricerca di una risposta che ho trovato un sacco di domande quasi simile al mio. L'unica differenza era che riempio il mio servizio dal mio controller invece di creare un servizio statico.

Entrambi i miei console.logs restituiscono un array vuoto. Perchè è questo?

+0

è necessario utilizzare il campo di applicazione principale o una delle il meccanismo di comunicazione come la trasmissione o gli eventi – Rafa

+0

il tuo orologio mi sembra un po 'strano. prova questo 'function() {return myData.getData()}' invece di 'data.getData()' –

risposta

1

L'espressione $watch deve essere una funzione (see the docs for $watch). Dando $watch una stringa dice a Angular di ispezionare una proprietà su $scope. Oltre a ciò, hai erroneamente fatto riferimento al servizio myData come "dati" nella stringa 'data.getData()'.

1) Guarda il risultato di myData#getData:

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

2) Guarda il riferimento alla matrice interna del servizio di myData su $scope:

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

Si dovrebbe funzionare se si chiama il addData dal primo controller ad esempio:

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

Suggerisco di utilizzare qualcosa come meccanismo di Pubub. non puoi sapere quando verranno visualizzati i dati. e osservare una funzione è un'operazione costosa. Puoi creare un meccanismo PubSub sul tuo servizio.

Un controller potrebbe registrarsi per un evento e un altro potrebbe pubblicare quell'evento. quindi con risorse minime potresti ottenere quello che vuoi.

Ecco un esempio

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

[Questo tipo di funzionalità è già disponibile in Angular] (http://toddmotto.com/all-about-angulars -emit-onda-on-pubblicare-sottoscrizione /). – sdgluck

+2

sì ma questo tipo di funzionalità su angularjs è per gli ambiti. a meno che tu non voglia usare rootScope, che sto sempre cercando di evitare. non puoi utilizzare la funzionalità angolare su questo problema – bahadir

0

un altro approccio sarebbe quello di utilizzare il pattern Observer, salva dover utilizzare il $watch affatto:

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); 
    }); 
}]);