2016-04-21 13 views
1

Ich entwickle eine mobile Anwendung in Wakanda Digital App Factory 1.0.3 mit Ionic und AngularJS mit einer 4D Backend-Datenbank.

Ich habe zwei verschiedene 4D Methoden zur Verfügung, bis 4D-Mobile über zwei getrennte 4D Tabellen, die über zwei verschiedene Winkel Controller zugegriffen werden:

.controller('homeCtrl', function($scope, $wakanda) { 
    $wakanda.init('servers').then(function(ds) { 
     ds.servers.www4DMionicHomeOverview().$promise.then(function(event) { 
      $json = event.result; 
      $scope.overview = $json.servers; 
      $scope.healthCheck = $json.healthCheck; 
     }, function(err) { 
      debugger 
      console.log(err); 
     }); 
    }, function(err) { 
     debugger 
     console.log(err); 
    }); 
}) 

.controller('errorLogCtrl', function($scope, $wakanda) { 
    $wakanda.init('server_log').then(function(ds) { 
     ds.server_log.www4DMionicErrorLog().$promise.then(function(event) { 
      $json = event.result; 
      $scope.errors = $json; 
     }, function(e) { 
      debugger 
      console.log(e); 
     }); 
    }, function(e) { 
     debugger 
     console.log(e); 
    }); 
}) 

Ich bin ein seltsames Problem bemerken diese 4D Methoden, dass der erste Aufruf Einer wird funktionieren, aber der zweite wird scheitern, egal welchen ich zuerst anrufe. Das heißt, wenn ich ds.server_log.www4DMionicErrorLog() zuerst anrufe funktioniert es aber dann nachfolgende Aufrufe an ds.servers.www4DMionicHomeOverview() scheitern, bis ich den Browser aktualisieren.

Das Gegenteil ist auch wahr, wenn ich zuerst ds.servers.www4DMionicHomeOverview() aufrufen dann funktioniert es aber nachfolgende Aufrufe an ds.server_log.www4DMionicErrorLog() fehlschlagen.


Der Fehler i für das zweite Verfahren erhalten ist:

ionic.bundle.js:25642 TypeError: Cannot read property 'www4DMionicHomeOverview' of undefined

oder

ionic.bundle.js:25642 TypeError: Cannot read property 'www4DMionicErrorLog' of undefined

Je nachdem, welche der beiden Methoden, die ich zuerst nennen.


Ich bin gespannt, ob dies in Zusammenhang stehen kann, wie ich $wakanda.init von jedem Controller nenne. Die documentation sagt nicht, dass es schlecht ist, dies zu tun.

Wäre es besser, einen Angular Service einzurichten und $wakanda im Service zu lösen? in Ihren Controller

+0

Gefunden diese Kommentare in der Wakanda-Quelle "Init-Methode einmal auf Ihrer Anwendung (die den WAF-Katalog, eine Beschreibung Ihrer Datenbank abrufen wird)" und "Nach dem Start Teil getan, können Sie auf den Datenspeicher über diese zugreifen Singleton-Methode "$wakandaResult.getDatastore = function() {.Angenommen, Sie können nur einmal init, muss die Dokumentation zeigen 2 Beispiele, wie es geht, nicht ein Beispiel in der gleichen App – garethb

+0

@Tim: Ich weiß nicht wakanda, aber wenn Sie mit UI-Router ich vorschlagen, dass Sie Ihre auflösen $ wakanda.init ('xxx') in jedem sate, dann in Ihrem Controller injizieren Sie das Ergebnis usw. Lassen Sie uns über das Ergebnis wissen, PS: Vergessen Sie nicht, den Debugger zu verwenden :) –

Antwort

2

ersetzen

$wakanda.init('servers').then(function(ds) {... 

von

$wakanda.init().then(function(ds) {... 

Und für alle das gleiche tun.

In Ihrem Fall empfehle ich Ihnen $ wakanda.init() zu verwenden

+0

Vielen Dank! Dies scheint zu funktionieren und zeigt an, dass es OK ist, '$ wakanda.init' von mehreren verschiedenen Controllern zu rufen. Aber wäre es besser, '$ wkanda.init' einmal vom LoginController aus aufzurufen und dann' var ds = $ wakanda.getDataStore(); 'von den anderen Controllern zu verwenden? Wenn ja, wie kann 'var ds = $ wakanda.getDataStore();' mit einem Versprechen verwendet werden? –

1

Mein Projekt 1.3.7 AngularJS

In einem Versuch verwendet, effizienter zu sein, verringere ich die Anzahl der Anrufe an

$wakanda.init().then(function oninit(ds) { 
          $rootScope.ds = $wakanda.$ds; 

Zukünftige Aufrufe verwenden $ rootScope.ds.

Allerdings hat jeder meiner Dienste einen eigenen Aufruf an $ wakanda.init();

 userCredentials: function(login,password,validate) { 
     var deferred = $q.defer(); 

     $wakanda.init().then(function oninit(ds) { 
      ds.User.userCredentials(login,password,validate, { 
       onSuccess: function(data) { 
        deferred.resolve(data); 
       }, 
       onError: function(err) { 
        deferred.reject(err.message); 
       } 
      }); 
     }); //$wakanda.init() 

     return deferred.promise; 
    }, 

Ich fand, dass innerhalb der UI-Controller mehrere Aufrufe an $ wakanda.init() fehlschlagen würde.

Verwandte Themen