【问题标题】:ionic: I have a scope variable empty from a stringified jsonionic:我有一个字符串化 json 中的空范围变量
【发布时间】:2015-05-24 20:43:40
【问题描述】:

我正在尝试从 SQLite 查询中过滤 JSON 结果。过滤器在我直接使用 JSON 时有效,但在我使用来自服务的查询时无效。然后,$scope.arrayme 就显示为空。

错误在哪里?谢谢!

这是服务:

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"
        }
   }
})

【问题讨论】:

  • 您是否收到任何错误消息?另外,miJson.getSubtipos() 的值是多少?

标签: json angularjs sqlite filter ionic


【解决方案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。可能不需要它们,但在不知道您的数据格式的情况下,我保持原样。

【讨论】:

  • 我在返回之前放了一个 console.log,它给出了 [{"val":0,"nombre":"Todo Tipo de Cocina","icon":"icon-svg52" ,"idsubtipo":1,"tipos_idtipo":1},{"val":0,"nombre":"Tapas","icon":"icon-svg44","idsubtipo":2,"tipos_idtipo":1 },{"val":0..... 但是它在控制器中给出了一个错误:TypeError: Cannot read property 'then' of undefined 但是,错误出现在 json 日志之前
  • 我猜这是因为$cordovaSQLite 没有像我预期的那样返回承诺。我已经编辑了我的回复,以将电话包含在$q.when 中。试试看。
  • 太好了,你的添加做到了!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多