Как отобразить findAll из JSON с Ember-данными в представлении?

Я хотел бы отобразить список, заполненный данными из файла JSON. Я бы использовал модифицированный адаптер. Вот код на данный момент, включая путь к тестовому json-файлу (поскольку я надеюсь получить некоторые помощь без использования СВЕТИЛЬНИКОВ)

Я не уверен, как использовать pushObject для получения результатов с помощью Ember-Data. Я знаю, что, возможно, до сих пор не понимаю некоторых концепций Ember-Data.

Мой вопрос: как мне получить список из файла JSON на основе следующего кода.

JavaScript

    App = Em.Application.create();

    App.store = DS.Store.create({
      revision: 4,
      adapter: App.adapter
    });

    App.adapter = DS.Adapter.create({

        findAll: function (store, type) {
            console.log('finding');
            var url = type.url;
            $.getJSON(url, function(data) {
                store.loadMany(type, data);
            });

        }

    });

    App.Person = DS.Model.extend({
        fName: DS.attr('string'),
        surname: DS.attr('string'),
        url: 'test.json',
    });
    App.personController = Ember.ArrayController.create({
        content: [],
        init: function(){
            this._super();// create an instance of the person model
            this.set('person', App.store.findAll(App.Person));
        },
    });

HTML

<script type="text/x-handlebars">
   {{#each App.personController}}            
        <p>{{fName}} {{surname}}</p>
    {{/each}}
</script>

ИЗМЕНИТЬ

Я обновил код в jsfiddle по рекомендациям @pauldechov, но все равно не повезло.

Вот содержимое для test.json, чтобы можно было воссоздать все приложение:

   [{"name": "Bruce","surname": "Banner"}, 
   {"name": "Peter","surname": "Parker"},
   {"name": "Natasha","surname": "Romanoff"},
   {"name": "Steve","surname": "Rogers"},
   {"name": "Tony","surname": "Stark"}]

person ladyboo    schedule 11.08.2012    source источник


Ответы (2)


  • Свойство url должно быть определено следующим образом:

    App.Person = DS.Model.extend({
        fName: DS.attr('string'),
        surname: DS.attr('string'),
    }).reopenClass({ url: 'test.json' });
    

    ... как переменная экземпляра, а не как переменная класса (см. пример: https://github.com/emberjs/data#find). То, как вы его определили (или если вы используете .reopen({...}) вместо .reopenClass({...}), он будет доступен через (конкретный) person.url, а не type.url.

  • Насколько я знаю, вы не можете добавить файл .json в ресурсы jsfiddle; он не будет доступен. Запрос полного URL-адреса test.json привел к междоменной проблеме.

  • Возможно, вам потребуется разместить модели над App.adapter, над App.store. Попробуйте это, если это все еще терпит неудачу.

  • Периферийное наблюдение: «имя» в test.json против «fName» в коде?

person dechov    schedule 12.08.2012
comment
Я воспользовался вашими рекомендациями, но по-прежнему не могу получить данные. Не могли бы вы попробовать код? Вы правы в том, что jsfiddle не разрешает междоменные ссылки, я просто пытался сделать данные json доступными для пересмотра, но теперь я обновил вопрос, поэтому вся информация доступна. Вся помощь очень ценится! - person ladyboo; 13.08.2012
comment
Первоначально я не ответил скрипкой, потому что в то время мне не приходило в голову, как обойти вызов AJAX (на самом деле это не разрешено вашим сервером). См. jsfiddle.net/pauldechov/P3eUP/4. а) Я вижу, что App.store должен быть определен ниже App.adapter — раньше не был в этом уверен. b) Извините, я не имел в виду, что type должно быть person внутри определения адаптера. c) Нет необходимости в явной загрузке {{action}}, поэтому я обновил исходную скрипку. Фактически, вы можете не переопределять init и просто иметь content: App.store.findAll(App.Person). - person dechov; 13.08.2012
comment
Потрясающий! Интересно, как в Ember могло показаться, что порядок не влияет на результат, когда на самом деле (и логически) это так. Большое спасибо за то, что нашли время и за все отличные рекомендации! - person ladyboo; 13.08.2012

App.personController = Ember.ArrayController.create({
    content: [],
    init: function(){
        this._super();// create an instance of the person model
        this.set('person', App.store.findAll(App.Person));
    },
});

Зачем ставить person? Не следует ли установить content?

person hpsof    schedule 02.10.2012
comment
Чтобы улучшить качество вашего поста, пожалуйста, укажите, как/почему ваш пост решит проблему. - person Mick MacCallum; 06.10.2012
comment
потому что this.set('person') кажется неверным. this.set('content') должен это сделать - person hpsof; 10.10.2012