Вопрос

Используя Backbone.js, пытаясь выполнить простой () на коллекции после извлечения элементов с сервера.

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

Вот код моего костяка:

  Model.Scenario = Backbone.Model.extend({

    defaults: function() {
      return {
        title: 'Scenario',
        answer: null,
      };
    }

  });

  Collection.Scenarios = Backbone.Collection.extend({

    model: Model.Scenario,

    url: "data.php",


  });

Тогда создание/выброс OBJ с методом маршрутизатора:

 var Router = new (Backbone.Router.extend({

    routes: {
      ":id"    : "page",
      "" : "page"
    },

    initialize: function() {
      _.bindAll(this, 'page');
      this.scenarios = new Collection.Scenarios();
      this.scenarios.fetch();
      console.log(this.scenarios);
      console.log(this.scenarios.get(1));
      console.log(this.scenarios.get(2));

      Backbone.history.start();
    },

  }))();

Наконец, вот что зарегистрировано до отладчика (чтобы вы могли видеть, что коллекция заполняется):

child
  _byCid: Object
  _byId: Object
    1: child
    2: child
    3: child
    4: child
    7: child
    10: child
    11: child
    12: child
    13: child
    14: child
    15: child
    16: child
    17: child
    18: child
    19: child
    20: child
    21: child
    22: child
    23: child
    26: child
    27: child
    28: child
  __proto__: Object
  length: 22
  models: Array[22]
  __proto__: ctor

 undefined  //first call to get(id)
 undefined  //2nd call to get(id)

Я озадачен. Извините за долгий пост, но я бы признателен за какое -либо понимание того, что мне не хватает. Спасибо.

Это было полезно?

Решение

Моя первая мысль состоит в том, что Fetch () не вернулся к тому времени, когда вы делаете свой .get ().

Но если то, что вы опубликовали, это именно то, что происходит, то первая консоль.log (this.scenarios) показывает, что загружен.

В любом случае, вы можете попробовать поместить консоль.

Моя вторая мысль состоит в том, что идентификатор для моделей не установлен правильно.

Backbone.Model по умолчанию использует свойство «ID» в качестве идентификатора для модели, collection.get (id) возвращает модель с идентификатором, в котором вы передали.

Итак, есть ли ответ от Data.php свойство идентификатора?

Попробуйте вместо этого:

 var Router = new (Backbone.Router.extend({

    routes: {
      ":id"    : "page",
      "" : "page"
    },

    initialize: function() {
      _.bindAll(this, 'page');
      this.scenarios = new Collection.Scenarios();
      this.scenarios.fetch({
        success: function(coll, resp) {
          console.log(coll);
          console.log(coll.first());
          console.log(coll.last());
        });
      Backbone.history.start();
    },

  }))();

Который должен вернуть первую и последнюю модель и вывести идентификационный выпуск из картинки.

Если это работает, что показывают модели для идентификационного свойства (coll.first (). Id)?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top