2013-04-01 14 views
5

Mi piace che AngularJS non richieda e la sintassi speciale per Modelli, ma c'è uno scenario che non riesco a capire. Prendiamo il seguente

miei avvolge Dataservice qualunque sapore di archiviazione dei dati che sto utilizzando:

app.factory('dataService', function() { 
    var data = 'Foo Bar'; 

    return { 
     getData: function() { 
      return data; 
     } 
    }; 
}); 

ho due controller che sia l'accesso lo stesso pezzo di dati:

app.controller('display', function($scope, dataService) { 
    $scope.data = dataService.getData(); 
}); 

app.controller('editor', function($scope, dataService) { 
    $scope.data = dataService.getData(); 
}); 

Se dunque io hanno due visualizzazioni, una delle quali modifica i dati, perché l'altro aggiornamento non viene eseguito automaticamente?

<div ng-controller="display"> 
<p>{{data}}</p> 
</div> 

<div ng-controller="editor"> 
<input type="text" value="{{data}}"/> 
</div> 

capisco come questo sta lavorando in qualcosa come Knockout dove sarei costretto a fare i dati di un oggetto osservabile ad eliminazione diretta. Pertanto, qualsiasi modifica in una parte dell'applicazione attiva le sottoscrizioni e aggiorna le visualizzazioni in un'altra. Ma non sono sicuro di come farlo in Angular.

Qualche consiglio?

+1

se 'data' è ambiti oggetto condivideranno riferimento allo stesso oggetto, quando i dati è primitivo, conservano valore indipendentemente – charlietfl

+2

problema non è correlato angolare, è il modo JavaScript funziona http://jsfiddle.net/uGdEc/ – charlietfl

+0

@charlietfl Esattamente. Quando si utilizza un livello modello come ad eliminazione diretta, si creano oggetti per tutto ciò che si intende osservabile. Rimuovi quel livello e non sembra aver senso come le primitive possano essere monitorate (come mostra il tuo violino). – nicholas

risposta

6

Ci sono alcuni cambiamenti che suggerirei di farlo funzionare.

  1. modificare l'oggetto di dati da una stringa di opporsi tipo
  2. Usa ng-model per legare il campo di input

HTML

<div ng-controller="display"> 
    <p>{{data.message}}</p> 
</div> 

<div ng-controller="editor"> 
    <input type="text" ng-model="data.message"/> 
</div> 

Script

app.factory('dataService', function() { 
    var data = {message: 'Foo Bar'}; 

    return { 
     getData: function() { 
      return data; 
     } 
    }; 
}); 

Demo: Fiddle

+0

off-topic, related, puoi vedere il mio q [qui] (http://stackoverflow.com/questions/20866954/angularjs-change-controller-by-condition/20867020?noredirect = 1 # 20867020) –

+1

@RoyiNamir Ne avrò un bottino ... ma non sono un esperto angolare –

1

Non sono stato bloccato con la stessa situazione, ma la cosa che mi salta fuori è quello che stai conficcando nel mirino. C'era un video angolare in cui è stato discusso l'ambito. È necessario inserire gli oggetti del modello nell'ambito e non utilizzare l'ambito come oggetto del modello.

Nell'esempio verranno creati due ambiti ciascuno con la stringa data. Poiché data è una stringa non modificabile, verrà sostituita nell'ambito di modifica quando viene modificata. Nel tuo esempio se hai dataService restituisci un oggetto e quell'oggetto è condiviso tra i controller, allora i tuoi problemi potrebbero essere risolti. Prova ad avere dataService restituire model di {data: data} e associare a model.data anziché a data.

Questo non è verificato, ma dovrebbe funzionare in base a come conosco le opere angolari.

Problemi correlati