Магистраль извлекает определенный объект из файла json, а не рендерит

Хорошо, я немного схожу с ума, пытаясь отобразить данные из файла json в двух отдельных представлениях/коллекциях.

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

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

введите здесь описание изображения

В моем классе Collection я вызываю синтаксический анализ:

parse:function(response, options) {
   return options.parseField ? response[options.parseField] : response;
},

я вызываю sync: (не уверен, что это вообще нужно)

sync: function(method, model, options) {
options.contentType = "application/json";
options.cache = false;
options.dataType = "json";
return Backbone.sync(method, model, options);
},

Затем внизу я создаю 2 новые коллекции и использую fetch для получения конкретных данных json, которые мне нужны для каждой коллекции, например так:

var links = new App.Collections.Links();
links.fetch({
  parseField: 'links_1',
  success: function () {
    console.log(links.toJSON());
            return links.toJSON();
  }
});

var links2 = new App.Collections.Links();
links2.fetch({
  parseField: 'links_2',
  success: function () {
    console.log(links2.toJSON());
            return links2.toJSON();
  }
}); 

Я делаю console.log и вижу, что мои данные json загружаются нормально, но не отображаются?

Что я здесь делаю не так..

Для отладки и понимания я включил весь свой файл js ниже.

(function() {

// Helper functions

// Defining namespacing rules
window.App = {
    Models: {},
    Collections: {},
    Views: {}
};

// Setting global template function, for simpel declaration later on by setting template('name'); for the built in template function.
window.template = function(id) {
    return _.template( $('.' + id).html() );
};


// Capitalize first letter in a link by adding .capitalize(); to the string.
String.prototype.capitalize = function() {
    return this.charAt(0).toUpperCase() + this.slice(1);
};

// Extending Backbone 

//Modellen
App.Models.Link = Backbone.Model.extend({
    defaults: {
        navn : 'i haz a name!',
        link : 'http://www.lolcats.com/',
        counter : 0
    }
});


//Collection
App.Collections.Links = Backbone.Collection.extend({ 

    model: App.Models.Link,
    url: 'data1.json',

    parse:function(response, options) {
        return options.parseField ? response[options.parseField] : response;
    },

    sync: function(method, model, options) {
        options.contentType = "application/json";
        options.cache = false;
        options.dataType = "json";
        return Backbone.sync(method, model, options);
    },

    // Sort the models 'highest first'
    comparator: function(link) {
    return -link.get('counter');
    }       
});


//Singel view
App.Views.LinkView = Backbone.View.extend({
    tagnavn: 'li',

    template: template('Links'),

    initialize: function() {
        this.model.on('change', this.render, this);
        this.model.on('destroy', this.remove, this);
    },

    events: {
    'click .edit' : 'retLink',
    'click .delete' : 'destroy',
    'click .LinkUrl' : 'addCounter'
    },

    retLink: function() {
        var newLinkNavn = prompt('What should the new name be?', this.model.get('navn'));

        if ( !newLinkNavn ) return;

        newLinkNavn = newLinkNavn.capitalize();
        this.model.set('navn', newLinkNavn);


        var newLinkUrl = prompt('What should the new url be?', this.model.get('link'));
        if ( !newLinkUrl ) return;
        this.model.set('link', newLinkUrl);
    },      

    destroy: function() {
        this.model.destroy();

    },

    // Increment the counter then user clicks it
    addCounter: function(e) {
        e.preventDefault();
        var newCounter = this.model.get('counter');
        this.model.set('counter', newCounter + 1);
    },

    remove: function() {
        this.$el.remove();
    },

    render: function()  {
        this.$el.html(this.template(this.model.toJSON()) );
        return this;
    }
});

//Collection View
App.Views.LinksView = Backbone.View.extend({
    tagName: 'ul',
    className: 'liste',

    initialize: function() {
        _.bindAll(this);
        this.collection.on('add', this.addOne, this);
        this.collection.on('reset', this.render);

        // Render view when a user has changed a model          
        this.collection.bind('change', this.render, this); 

        $('.navnClass').focus();
        this.load();
        this.render();

    },

    load: function() {
        this.collection.fetch({
          add: true,
          success: this.loadCompleteHandler,
          error: this.errorHandler
        });     
    },

    loadCompleteHandler : function(){
        this.render();
    },

    errorHandler : function(){
        throw "Error loading JSON file";
    },

    render: function() {
        // Empty the UL before populating it with the new models and sorting it.
        this.$el.empty();
        this.collection.sort();

        this.collection.each(this.addOne, this);
        return this;
    },

    addOne: function(link) {
        var linkView = new App.Views.LinkView({ model: link });
        this.$el.append(linkView.render().el);
    }
});

// Create link view 
App.Views.AddLink = Backbone.View.extend({
    el: '#addLink',

    events: {
        'submit' : 'submit'
    },

    submit: function(e) {
        e.preventDefault();
        var linkNavn = $(e.currentTarget).find('.navnClass').val(),
             linkNum =  $(e.currentTarget).find('.linkClass').val();



        // Tildel link navn en værdi, hvis det er tomt   
        if ( ! $.trim(linkNavn)) {
                linkNavn = 'I haz a name!';
        }

        // Tildel link url en værdi, hvis det er tomt    
        if( ! $.trim(linkNum)) {
                linkNum = 'http://www.lolcats.com/';
        }

        // Tilføj http:// foran værdi, hvis den ikke indeholder det i forvejen.
        if( linkNum.indexOf( "http://" ) == -1 ) {
             addedValue = 'http://',
             linkNum = addedValue + linkNum;
        }

        // nulstil og sæt fokus på link navn feltet.
        $(e.currentTarget).find('.navnClass').val('').focus();
        $(e.currentTarget).find('.linkClass').val('');
        this.collection.add({ navn:linkNavn, link: linkNum });
    }

});


// new links collection
// populate collection from external JSON file
// change navn to match the link heading

var links = new App.Collections.Links();
links.fetch({
  parseField: 'links_1',
  success: function () {
    console.log(links.toJSON());
            return links.toJSON();
  }
});

var links2 = new App.Collections.Links();
links2.fetch({
  parseField: 'links_2',
  success: function () {
    console.log(links2.toJSON());
            return links2.toJSON();
  }
}); 


// new collection view (add)
var addLinkView = new App.Views.AddLink({ collection: links });

// new collection view
var linksView = new App.Views.LinksView({ collection: links });
$('.links').html(linksView.el);

// new collection view
var linksView2 = new App.Views.LinksView({ collection: links2 });
$('.links2').html(linksView2.el);   


})();

person Marcel Huss-Nielsen    schedule 14.02.2013    source источник
comment
Можете ли вы сказать мне, что делает ваше приложение в целом?   -  person Nishant Jani    schedule 14.02.2013
comment
Он просто показывает некоторые ссылки с соответствующими именами, но есть X контейнеров ссылок, которые необходимо заполнить ссылками из 1 файла json, поэтому я хочу иметь возможность извлекать только определенные данные json для каждого контейнера ссылок. Затем ссылки сортируются по количеству кликов по ним. поэтому у меня есть счетчик и метод сортировки.   -  person Marcel Huss-Nielsen    schedule 14.02.2013
comment
просто чтобы уточнить @Marcel, когда вы вводите имя в текстовое поле и нажимаете «Добавить», ссылка должна отображаться в двух местах одновременно, а затем, в зависимости от количества кликов, вы хотите отсортировать ссылки в соответствующих местах   -  person Nishant Jani    schedule 15.02.2013
comment
Нет, вы можете игнорировать функцию добавления новой ссылки. Я говорю о загрузке страницы, у меня есть файл json, который загружается в 2 контейнера ссылок, одна часть (links_1) должна загружаться в первую коллекцию/представление. вторая часть (links_2) должна быть загружена во вторую коллекцию/представление. Он уже создан в приложении. И данные JSON также загружаются, как вы можете видеть на моем прикрепленном снимке экрана. в консоли. Я просто не могу понять, как отображать данные в двух представлениях.   -  person Marcel Huss-Nielsen    schedule 15.02.2013
comment
Ссылки I haz a name - это два загружаемых объекта, каждый из которых представляет коллекцию, мне нужно извлечь и показать данные массива вместо объекта... в консоли на снимке экрана видно, что каждый объект содержит количество ссылок и имен ... это данные, которые я хочу отобразить вместо двух объектов имени.   -  person Marcel Huss-Nielsen    schedule 15.02.2013


Ответы (1)


Не могли бы вы попробовать это:

var links2 = new App.Collections.Links();
links2.on("reset", function(collection){
   console.log("reset event", collection);
}
links2.fetch({
  parseField: 'links_2',
  wait:true, #wait for the server to respond
  success: function (collection, response) {
    console.log(collection, response);
  }
}); 

возврат в успешном вызове ничего не делает (он вернется к объекту $.ajax). Я добавил ожидание, потому что он вызовет вызов успеха немедленно, если он пройдет проверку на стороне клиента (у вас ее нет, поэтому сначала всегда будет вызываться успех).

Вы говорите, что это ничего не делает. Но для рендеринга чего-то вам нужен View. Я не вижу представления в вашем коде.

Вот краткий пример представления:

var Link = new Backbone.View.extends({
    el: $('body'),
    initialize: function(){
       this.listenTo(this.collection, 'reset', this.render, this)
    },
    render: function(){
     this.$el.empty();
     this.collection.each(function(item){
        this.$el.append(item.get('id') + '<br />');
     });

    }
})
var view = new Link({collection: links2});
person Jareish    schedule 15.02.2013
comment
Привет Андре, у меня есть 2 представления в моем коде - одно для элемента и одно для коллекции. вам просто нужно прокрутить вниз до той части, где я вставил весь свой файл js. Ваш код делает то же самое, что и мой код — он возвращает объект links_2 вместо данных внутри массива links_2. - person Marcel Huss-Nielsen; 15.02.2013