2013-04-15 4 views
67

Ho una variabile che verrà utilizzata da uno o più controllori, modificata dai servizi. In questo caso, ho creato un servizio che mantiene questa variabile in memoria e la condivide tra i controller.Variabili di rilegatura da servizio/fabbrica a controllori

Il problema è: ogni volta che la variabile cambia, le variabili nei controller non vengono aggiornate in tempo reale.

Ho creato questo violino per aiutare. http://jsfiddle.net/ncyVK/

--- Si noti che la {{countService}} o {{countFactory}} viene mai aggiornata quando ho incrementare il valore di conteggio.

Come si può associare la variabile Servizio/Fabbrica a $ scope.variable nel Controller? Cosa sto facendo di sbagliato?

risposta

115

Non è possibile associare variabili. Ma puoi associare variabili di accesso o oggetti che contengono questa variabile. Qui è corretto jsfiddle.

Fondamentalmente è necessario passare allo scope qualcosa, che può restituire/o mantenere il valore corrente. Per esempio.

fabbrica:

app.factory('testFactory', function(){ 
    var countF = 1; 
    return { 
     getCount : function() { 

      return countF; //we need some way to access actual variable value 
     }, 
     incrementCount:function(){ 
      countF++; 
      return countF; 
     } 
    }    
}); 

Controller:

function FactoryCtrl($scope, testService, testFactory) 
{ 
    $scope.countFactory = testFactory.getCount; //passing getter to the view 
    $scope.clickF = function() { 
     $scope.countF = testFactory.incrementCount(); 
    }; 
} 

Vista:

<div ng-controller="FactoryCtrl"> 

    <!-- this is now updated, note how count factory is called --> 
    <p> This is my countFactory variable : {{countFactory()}}</p> 

    <p> This is my updated after click variable : {{countF}}</p> 

    <button ng-click="clickF()" >Factory ++ </button> 
</div> 
+0

Quindi, in sostanza, la fabbrica è solo un condiviso (Singleton) contenitore per i dati e le funzioni sui dati. Gestisci/sincronizzi manualmente i dati dentro e fuori l'ambito $? – sambomartin

+1

@sambomartin right. Ottimo articolo [qui] (http://fdietz.github.io/recipes-with-angular-js/controllers/sharing-code-between-controllers-using-services.html) – user4815162342

+2

Quindi passando la funzione come testFactory.getCount e non invocandolo, e invocandolo nell'interfaccia utente hai vincolato il valore dei servizi. Considerando che se $ scope.countFactory = testFactory.getCount() dovresti invocare la funzione una sola volta quando inizializzata e nulla è vincolato? Quindi non aggiornato più tardi se il valore cambia? – mtpultz

0

Non è una buona idea di legare tutti i dati dal servizio, ma se avete bisogno di più, ho suggerisci quelli che seguono 2 modi.

1) Ottieni questi dati non all'interno del tuo servizio. Ottieni dati all'interno del tuo controller e non avrai alcun problema a collegarlo.

2) È possibile utilizzare la funzione Eventi di AngularJS. È anche possibile inviare dati a quell'evento.

Se avete bisogno di più con esempi qui è l'articolo che forse può aiutarti.

http://www.w3docs.com/snippets/angularjs/bind-value-between-service-and-controller-directive.html