2015-05-24 3 views
1

Я пытаюсь отфильтровать результат JSON из SQLite-запроса. Фильтр работает, когда я использую JSON напрямую, но это не происходит, когда я использую запрос из службы. Тогда $ scope.arrayme просто выглядит пустым.ionic: у меня есть переменная области, пустая из строки json

Где ошибка? Спасибо!

Это услуга:

getSubtipos: function() { 
    var query = "SELECT subtipos.idsubtipo, subtipos.tipos_idtipo, subtipos.nombre, subtipos.icon, subtipos.val FROM subtipos"; 
    var arraySubtipos = []; 
    $cordovaSQLite.execute(db, query, []).then(function(res) { 
     if(res.rows.length > 0) { 
      for(var i = 0; i < res.rows.length; i++) { 
       arraySubtipos.push(res.rows.item(i)); 
      } 
     } else { 
      console.log("No results found"); 
     } 
    }, function (err) { 
     console.error("ERROR: " + err.message); 
    }).finally(function() { 
     arraySubtipos = JSON.stringify(arraySubtipos); 
    }); 
     return arraySubtipos; 
    } 

Это контроллер:

.controller('MenuSubtiposCtrl', function($scope, $filter, miJson, $stateParams, $cordovaSQLite){ 
    var arrayme = JSON.stringify(miJson.getSubtipos()); 
    $scope.arrayme = $filter("filter")(JSON.parse(arrayme), {tipos_idtipo: $stateParams.foo}); 
}) 

И это состояние:

.state('app.menusubtipos', { 
    url: "/menusubtipos/:foo", 
    views: { 
     'menuContent': { 
      templateUrl: "templates/menuSubtipos.html", 
      controller: "MenuSubtiposCtrl" 
     } 
    } 
}) 
+0

Вы получаете сообщения об ошибках? Кроме того, что такое значение 'miJson.getSubtipos()'? –

ответ

1

Там может быть больше проблем, чем я я сразу заметил, но я заметил, что вы возвращаете переменную в своей функции getSubtipos прежде чем он будет установлен.

Функция $cordovaSQL.execute() является асинхронной функцией. В результате вы возвращаете arraySubtipos до его установки.

Лучший способ сделать это было бы в getSubtipos сделать следующее:

var arraySubtipos = []; 
return $q.when($cordovaSQLite.execute(db, query, []) 
    .then(function(res) { 
     if(res.rows.length > 0) { 
      for(var i = 0; i < res.rows.length; i++) { 
       arraySubtipos.push(res.rows.item(i)); 
      } 
     } else { 
      console.log("No results found"); 
     } 
     return JSON.stringify(arraySubtipos); 
    })); 

// Тогда, в контроллере, сделайте следующее:

.controller('MenuSubtiposCtrl', function($scope, $filter, miJson, $stateParams, $cordovaSQLite){ 
    miJson.getSubtipos() 
     .then(function(arrayMe) { 
      // No need to stringify it again 
      $scope.arrayme = $filter("filter")(JSON.parse(arrayme), {tipos_idtipo: $stateParams.foo}); 
     }) 
     .catch(function(error) { 
      // Handle the error here 
     }); 
    var arrayme = JSON.stringify(miJson.getSubtipos()); 
}); 

Я тоже мало подозрительно о вашем использовании JSON.stringify и JSON.parse. Скорее всего, они не нужны, но, не зная формат ваших данных, я оставил это как есть.

+0

Я положил console.log перед возвратом и дал [{"val": 0, "nombre": «Todo Tipo de Cocina», «icon»: «icon-svg52», «idsubtipo»: 1, "tipos_idtipo": 1}, { "VAL": 0, "Nombre": "Тапас", "значок": "значок-svg44", "idsubtipo": 2, "tipos_idtipo": 1}, { "VAL": 0 ..... Но это дает ошибку в контроллере: TypeError: Не удается прочитать свойство 'then' of undefined Однако ошибка появляется перед журналом json – Ramon

+1

Я предполагаю, что это потому, что '$ cordovaSQLite' isn Я возвращаю обещания, как я ожидал. Я отредактировал свой ответ, чтобы завершить вызов в '$ q.when'. Попробуйте. –

+0

Отлично, ваше дополнение сделало это! Большое спасибо! – Ramon

Смежные вопросы