2014-12-15 4 views
8

La mia applicazione ha un modulo angolare:modulo Parent come dipendenza

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


Il modulo dispone anche di un servizio per realizzare le cose di ingresso/uscita:

io.service('ioService', function() { 
    var dataStore = {}; 

    return { 
     pushData: function (key, value) { 
      dataStore[key] = value; 
     }, 
     getData: function (key) { 
      return dataStore[key]; 
     } 
    }; 
}); 


Più tardi mi desidera memorizzare la variabile dataStore con JSON in un file come oggetto.

Ora ho un iframe nella mia aplicazione per visualizzare alcuni contenuti con schede, è possibile chiamarlo qualcosa come un browser.


Per dare la possibilità di effettuare alcune impostazioni, ho voluto farlo in un iframe. Al fine di salvare i dati in un file, ho bisogno di chiamare il IO_Service, che è l'applicazione genitore

Nel mio iframe ho un modulo:

var settings = angular.module("settings", []); 

con un controller

settings.controller("MyController", function ($scope) { ... } 

Quindi devo dichiarare una dipendenza per il modulo genitore per utilizzare lo ioService per chiamare la funzione pushData.

Qualcuno ha qualche consiglio per me per realizzare questo?

+0

Maybw suggerimento sciocco, ma non è possibile inserire le impostazioni di ogni scheda e tabulazione all'esterno dell'iframe? In questo modo sarai in grado di controllarlo – nacholibre

+0

Ora l'ho fatto in questo modo, le schede sono solo iframe che caricano html-dicuments. Le impostazioni ora ho le mie impostazioni direttamente implementate nell'applicazione per condividere la magia angolare con i miei altri controller :) – Ba5t14n

risposta

0

Tutto quello che dovresti fare è lasciare che il modulo delle impostazioni sappia sia dipendente dal modulo operazioni IO e una volta fatto è possibile utilizzare il servizio di I/O come se fosse nello stesso modulo, ad esempio:

var settings = angular.module("settings", ["IO_Operations"]); 

settings.controller("MyController", function ($scope, ioService) { ... } 
+1

il modulo delle impostazioni è in un iframe, con questo metodo non funziona, devo dire angolare, che è un modulo genitore. Ad ogni modo, grazie per il tuo aiuto :) – Ba5t14n

+1

Ho perso quella chiave piuttosto di informazioni quando ho letto la domanda, stupido. :) Se hai angolare in una pagina e un iframe non ti darà due "istanze" angolari separate senza alcun modo di comunicare tra loro? C'è una ragione per cui devi usare un iframe? – DoctorMick

+1

Bene, è un'applicazione che utilizza fondamentalmente schede per visualizzare più siti Web e ho pensato che sarebbe stato bello avere le impostazioni in una scheda come in Firefox. Bene anche il Javascript può comunicare, quindi ho solo bisogno di usare il genitore .. Forse hai ragione, perché ho bisogno di caricare nuovamente il file anular.js nella mia pagina web delle impostazioni. Penso di rendere le impostazioni solo in un'altra finestra, forse più facile ... – Ba5t14n

1

Tutto il DoctorMick says here è corretto e deve essere eseguito per accedere al servizio nel controller.

Inoltre, si deve affrontare il fatto che il genitore e iframe non condividono qualsiasi contesto Javascript:

The Same-Domain Risposta

Nel modulo, dataStore deve essere o window.dataStore o window.parent.dataStore (o possibilmente window.top.datastore) a seconda se il modulo è stato caricato in un iframe o come pagina principale:

io.service('ioService', function() { 
    var inIframe = (window.parent !== window); // or (window.top !== window); 

    // If we are in the iframe, we want to use the parent's dataStore, 
    // If we are not in the iframe, we are the parent, so use ours. 
    var dataStore = inIframe ? window.parent.dataStore : window.dataStore; 

    dataStore = dataStore || {}; 

    return { 
     pushData: function (key, value) { 
      dataStore[key] = value; 
     }, 
     getData: function (key) { 
      return dataStore[key]; 
     } 
    }; 
}); 

O qualcosa del genere. Fondamentalmente, capire se si sta caricando nell'iframe o genitore e allegare al proprio (come genitore) dataStore o genitore dataStore.

Il Cross-Domain Risposta

Il telaio principale e l'iframe sono totalmente indipendenti - si potrebbe anche (quasi) due diverse schede del browser - in modo che non condividono nulla dal punto di vista dei dati Javascript . Senza usare qualche tipo di libreria di comunicazione iframe o usando una API (tramite WebSockets, forse?) per eseguire il backup, non sarà possibile ottenere i due frame per comunicare.

Se riconsiderate il vostro problema come due applicazioni distinte - il "contenitore del browser" e una collezione di "browser" - e cercate una comunicazione appropriata tra applicazione e applicazione, ciò potrebbe aiutare.

Più concretamente, supponendo che si desidera una soluzione client-side, i tuoi pushData(key, value) e getData(key) metodi nella ioService solo bisogno di avvolgere un meccanismo di comunicazione costruita utilizzando il nativo Window.postMessage API o una libreria come postmessage o porthole.