2016-04-21 4 views
1

Я разрабатываю мобильное приложение, встроенное в Wakanda Digital App Factory 1.0.3 с использованием Ionic и AngularJS с базой данных 4D.

У меня есть два различных 4D методы доступны через 4D-Mobile с помощью двух отдельных 4D таблиц, которые доступны через два различных угловых контроллеров:

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

Я замечаю странный вопрос, призывающее эти 4D методы в том, что первый один будет работать, но второй будет терпеть неудачу, независимо от того, какой из них я называю первым. То есть, если я вызываю ds.server_log.www4DMionicErrorLog(), сначала он работает, но затем последующие вызовы ds.servers.www4DMionicHomeOverview() не удаются, пока я не обновляю браузер.

Противоположность также верна в том, что если я звоню ds.servers.www4DMionicHomeOverview(), сначала он работает, но последующие вызовы ds.server_log.www4DMionicErrorLog() терпят неудачу.


Я получаю ошибку для второго метода:

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

или

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

В зависимости от того, какой из двух методов я называю первым.


Мне интересно, если это может быть связано с тем, как я зову $wakanda.init от каждого контроллера. documentation не говорит, что это плохо.

Было бы лучше настроить Угловое обслуживание и разрешить $wakanda в службе?

+0

Нашли эти комментарии в источнике Wakanda «Метод Init, который будет выполняться один раз в вашем приложении (который будет извлекать каталог WAF, описание вашего db)» и «После выполненной части init вы можете получить доступ к хранилищу данных через это одиночный метод "$wakandaResult.getDatastore = function() {.Поэтому, предполагая, что вы можете только один раз инициализировать, в документации должно быть показано 2 примера, как это сделать, а не один пример в одном приложении – garethb

+0

@Tim: я не знаю wakanda, но если вы используете ui-router, я предлагаю вам разрешить ваши $ wakanda.init ('xxx') в каждом поле, затем в вашем контроллере вы вводите результат и т.д., сообщите нам о результатах, PS: не забудьте использовать отладчик :) –

ответ

2

Заменить

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

по

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

И сделать то же самое для всех в контроллерах.

В вашем случае, я рекомендую вам использовать $ wakanda.init()

+0

Спасибо! Кажется, это работает, указывая, что это нормально, чтобы вызвать '$ wakanda.init' из нескольких разных контроллеров. Однако было бы лучше вызвать '$ wkanda.init' один раз из LoginController, а затем использовать' var ds = $ wakanda.getDataStore(); 'из других контроллеров? Если да, то как можно использовать 'var ds = $ wakanda.getDataStore();' использовать с обещанием? –

1

Мой проект использует 1.3.7 AngularJS

В попытке быть более эффективным, я уменьшить количество вызовов

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

В будущих вызовах используется $ rootScope.ds.

Однако каждый из моих Услуг имеет свой собственный вызов $ 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; 
    }, 

Я обнаружил, что в контроллерах пользовательского интерфейса несколько вызовов на $ wakanda.init() не удастся.