Cordova: список OnsenUI не заполняется синтаксическим анализом angularjs

Я пытаюсь извлечь список имен из синтаксического анализа и добавить их в список onsenui, запрос синтаксического анализа работает, потому что я зарегистрировал их, и это сработало, но элементы списка нигде не отображаются.

Вот приложение.js

(function(){
var app = angular.module('myApp', ['onsen.directives']);
app.factory('Data', function(){
    var Data = {};

    Data.items = [];

    var parseAPPID = "***************************************";
    var parseJSID = "****************************************";

    //Initialize Parse
    Parse.initialize(parseAPPID,parseJSID);

    var NoteOb = Parse.Object.extend("place");

    //$(document).on("pageshow", "#places", function(e, ui) {
    //$.mobile.loading("show");
    var Places = Parse.Object.extend("Places");
    var query = new Parse.Query(Places);
    query.limit(100);
    query.ascending("Name");

    query.find({
        success:function(results) {
            for(var i=0; i<results.length; i++) {
                Data.items[i] = results[i].get('Name');
            }
        },error:function(e) {


        }
    });

    return Data;
});

app.controller('listCtrl', function($scope, Data) {
    $scope.items = Data.items;
});
})();

А вот html страницы

Индекс.html:

<!DOCTYPE html>
<html ng-app="myApp">
<head>
    <meta charset="utf-8" />
    <meta name="format-detection" content="telephone=no" />
    <!-- WARNING: for iOS 7, remove the width=device-width and height=device-height      attributes. See https://issues.apache.org/jira/browse/CB-4323 -->
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-    scale=1, user-scalable=no">
    <meta name="msapplication-tap-highlight" content="no" />

    <!--<link rel="stylesheet" src="http://code.jquery.com/jquery-1.9.1.css"></link>-->
    <!--<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.js">    </script>-->

    <link rel="stylesheet" href="lib/onsen/css/onsenui.css">  
    <link rel="stylesheet" href="lib/onsen/css/topcoat-mobile-onsen-blue.css">
    <script src="http://www.parsecdn.com/js/parse-1.2.19.min.js"></script>
    <script src="lib/onsen/js/angular/angular.js"></script>    
    <script src="lib/onsen/js/angular/angular-touch.js"></script>
    <script src="lib/onsen/js/onsenui.js"></script> 

<title>MY APP</title>
</head>
<body>
    <ons-navigator page="list.html">
    </ons-navigator>

    <script type="text/javascript" src="cordova.js"></script>
    <script type="text/javascript" src="js/index.js"></script>
    <script type="text/javascript" src="js/app.js"></script>
</body>
</html>

список.html:

<!DOCTYPE HTML>

<html>
<head>
    <title>List A-Z</title>
</head>

<body>
    <ons-page class="center">
        <div ng-controller="listCtrl">
            <ons-list>
                <ons-list-item ng-repeat="item in items">
                    {{item}}
                </ons-list-item>
            </ons-list>
        </div>
    </ons-page>
</body>
</html>

person deavisdude    schedule 16.08.2014    source источник


Ответы (1)


Согласно этой ссылке, я обновил свой ответ следующим образом:

(function(){
var app = angular.module('myApp', ['onsen.directives']);
app.factory('Data', function($q){



var parseAPPID = "***************************************";
var parseJSID = "****************************************";

//Initialize Parse
Parse.initialize(parseAPPID,parseJSID);

var Data = Parse.Object.extend("Places", {
  // Instance methods
}, {
  async: function() {
    var deferred = $q.defer();
    var query = new Parse.Query(Places);
    query.limit(100);
    query.ascending("Name");

    query.find({
        success:function(results) {
            // Resolve the deferred $q object before returning the promise
            deferred.resolve(results);
            for(var i=0; i<results.length; i++) {
                Data.items[i] = results[i].get('Name');
            }
        },error:function(e) {


        }
    });
    return deferred.promise;
  }
});

return Data; 

});

app.controller('listCtrl', function($scope, Data) {

    Data.async().then(function(d) {
        $scope.items = d.items;
    });  
});

})();

Удачи. И вам может понадобиться увидеть это: AngularJS: сервисный запрос возвращает нулевой результат.

person khemry    schedule 18.08.2014
comment
Он работает с обычными данными, что меня действительно беспокоит, потому что, насколько я понимаю, нет причин, по которым он не должен работать здесь, я даже зарегистрировал Data.items[i] после присвоения значений, и он отображал строки, которые я пытался получить. - person deavisdude; 19.08.2014
comment
Можете ли вы показать мне пример ваших данных? Я хочу увидеть его формат. - person khemry; 20.08.2014
comment
Это список ресторанов, я почти уверен, что здесь я получаю только строковое значение Name в алфавитном порядке. Я не сильно форматировал, я просто зашел в браузер данных для синтаксического анализа и добавил столбцы для вещей, которые я хотел сохранить, и строку для каждого места, есть ли что-то еще? - person deavisdude; 20.08.2014
comment
Еще одна вещь заключается в том, что я получаю эту ошибку в консоли Chrome при запуске приложения с пульсацией: Cordova :: XMLHttpRequest :: setRequestHeader не работает с JSONP. - person deavisdude; 21.08.2014
comment
Итак, ваши данные в формате JSONP? Разве данные Parse не являются обычным форматом JSON? И, возможно, это проблема пульсации. Как насчет того, чтобы попробовать отключить междоменный прокси в настройках Ripple. Пока Data.items получает правильные данные, проблем с вашим кодом или OnsenUI не возникает. - person khemry; 22.08.2014
comment
Функция Cross Domain Proxy избавила от ошибки, но я думаю, что определил проблему. Данные не определены в ListCtrl и даже прямо перед оператором return. Единственное место, где он имеет значения, находится в цикле for... - person deavisdude; 26.08.2014
comment
Похоже, это ничего не исправило... асинхронность теперь не определена - person deavisdude; 02.09.2014
comment
Обратная связь: TypeError: невозможно прочитать свойство «тогда» неопределенного - person deavisdude; 02.09.2014
comment
Вы обновили свой код, как указано выше? Согласно вашей ошибке, похоже, что у вас нет асинхронного фонда на фабрике. Можешь еще раз проверить свой код? В моем коде есть асинхронная функция. - person khemry; 02.09.2014
comment
Да, асинхронность до сих пор не игнорируется. Я также добавил изменения, которые вы внесли в свой ответ во время этого комментария, и теперь это $ q, который является неопределеннымReferenceError: $ q не определен - person deavisdude; 02.09.2014
comment
Извините, просто пропустил $q в качестве параметра, в консоли больше нет ошибок, но я все еще не получаю результаты, которые ищу... В моем списке ничего не отображается, и когда я пытался зарегистрировать d.items [0] в последней функции, где элементы добавляются в список, мне сообщается, что d.items не определено, что странно, потому что для предыдущей строки не выдается ошибка - person deavisdude; 02.09.2014
comment
@deavisdude: я обновил свой ответ. Тяжело, когда я не могу проверить твой код. Если этот обновленный ответ все еще не работает, я не знаю, что еще делать, если вы не дадите мне полный код для тестирования. В любом случае удачи. - person khemry; 04.09.2014
comment
Хорошо, отличные новости: код теперь работает, за исключением того, что данные заполняются целыми объектами, а не только указанным атрибутом... На самом деле, data.items пуст в конце выполнения, но Data имеет все объектов синтаксического анализа, которые я запросил, в правильном порядке (в алфавитном порядке), но это весь объект, а не только имена... Вот пример элемента списка, когда я установил для scope.items значение d(d.items is undefined, но d содержит объекты): imgur.com/sSQF5b0 - person deavisdude; 08.09.2014
comment
ОК, несмотря на путаницу, я смог получить список с такими именами: создать массив с именами, прокрутить d.length, назначив имена [i] для d[i].attributes.Name и, наконец, установив scope.items к именам! - person deavisdude; 08.09.2014