2014-12-15 14 views
8

Meine Anwendung hat eine Winkelmodul:Geordnetes Modul als Abhängigkeit

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


Das Modul hat auch einen Service-Eingabe/Ausgabe-Dinge zu realisieren:

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

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


Später möchte ich speichern Die dataStore Variable mit JSON in einer Datei als Objekt.

Jetzt habe ich eine iframe in meiner Anwendung, um einige Inhalte mit Tabs anzuzeigen, könnten Sie es so etwas wie einen Browser nennen.


Um die Möglichkeit zu geben, einige Einstellungen vorzunehmen, wollte ich es in einem iframe tun. Um die Daten in einer Datei zu speichern, muss ich die IO_Service nennen, die

in der Stammanmeldung ist

In meinem iframe habe ich ein Modul:

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

mit einem Controller

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

ich brauche eine Abhängigkeit für das übergeordnete Modul zu erklären, die ioService zu verwenden, um die pushData Funktion aufzurufen.

hat einige Tipps für mich jemand, dies zu realisieren haben?

+0

Maybw albernen Vorschlag, aber können Sie nicht die Einstellungen der einzelnen Registerkarten und Tabs außerhalb der Iframe? Auf diese Weise werden Sie in der Lage sein, es zu steuern – nacholibre

+0

Ich habe es jetzt so gemacht, sind die Tabs nur Iframes, die HTML-Didgets lädt. Die Einstellungen ich habe jetzt meine Einstellungen direkt in der Anwendung implementiert, um die Winkelmagie mit meinen anderen Controllern zu teilen :) – Ba5t14n

Antwort

0

Alles, was Sie tun müssen, ist, dass das Einstellungsmodul eine Abhängigkeit vom E/A-Betriebsmodul hat. Sobald dies erledigt ist, können Sie den E/A-Service wie im selben Modul verwenden:

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

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

das Einstellungsmodul ist in einem iframe, mit dieser Methode funktioniert es nicht, ich muss angular sagen, dass es ein ist Elternmodul. Wie auch immer, danke für Ihre Hilfe :) – Ba5t14n

+1

Ich verpasste diese ziemlich wichtige Information, wenn ich die Frage lese, alberne mich. :) Wenn Sie eckig in einer Seite haben und ein Iframe wird Ihnen nicht zwei separate Winkel "Instanzen" ohne Kommunikation zwischen ihnen geben? Gibt es einen Grund, warum Sie einen Iframe verwenden müssen? – DoctorMick

+1

Nun, es ist eine Anwendung, die im Grunde Tabs verwenden, um mehrere Websites anzuzeigen, und ich dachte, es wäre cool, die Einstellungen in einem Tab wie in Firefox zu haben. Nun das Javascript kann auch kommunizieren, daher muss ich nur Eltern verwenden. Vielleicht sind Sie richtig, weil ich die anular.js Datei erneut auf meiner Einstellungswebseite laden muss. Ich denke über die Einstellungen nur in einem anderen Fenster, vielleicht so einfach ... – Ba5t14n

1

Alles DoctorMick says here ist korrekt und muss durchgeführt werden, um auf den Dienst überhaupt in Ihrem Controller zugreifen zu können.

Zusätzlich haben Sie die Tatsache Rechnung zu tragen, dass die Eltern und iframe keinen Javascript Kontext teilen:

The Same-Domain

In Ihrem Modul Antwort, dataStore muss entweder window.dataStore sein oder window.parent.dataStore (oder möglicherweise window.top.datastore), je nachdem, ob das Modul in einem -Frame oder als Haupt Seite geladen ist:

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

Oder etwas in diesem Sinne. Im Grunde, herauszufinden, ob Sie in den Iframe oder Eltern geladen werden und entweder an Ihre eigenen (als Eltern) dataStore oder die dataStore der Eltern anhängen. Antwort

The Cross-Domain

Der Hauptrahmen und die iframe sind völlig unabhängig - sie könnten auch (fast) zwei verschiedene Browser-Tabs sein - so dass sie nicht alles aus einer Daten Perspektive Javascript teilen . Ohne irgendeine Art von iframe-Kommunikationsbibliothek zu verwenden oder eine API zu verwenden (über WebSockets, vielleicht?) um es zu sichern, werden Sie nicht in der Lage sein, die beiden Frames zur Kommunikation zu bringen.

Wenn Sie Ihr Problem als zwei verschiedene Anwendungen betrachten - den 'Browser-Container' und eine Sammlung von 'Browsern' - und nach einer geeigneten Anwendung-zu-Anwendung-Kommunikation suchen, könnte das helfen.

Konkreter vorausgesetzt, Sie eine clientseitige Lösung wollen, Ihre pushData(key, value) und getData(key) Methoden in der ioService brauchen nur einen Kommunikationsmechanismus wickeln gebaut entweder die native Window.postMessage API oder eine Bibliothek wie postmessage oder porthole.

Verwandte Themen