С чего начать, модели есть, а их нет?

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

console.log('actions.models', this.model.actions.models)
console.log('actions.models.length', this.model.actions.models.length)
console.log('first actions.models', this.model.actions.models[0])

выход

actions.models [ Action ]
actions.models.length 0
first actions.models undefined

если я добавлю setTimeout, скажем, 2 секунды к этому коду, я получаю

actions.models [ Action ]
actions.models.length 1
first actions.models Action

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

Если кто-нибудь может помочь указать мне в правильном направлении, я был бы признателен. Спасибо большое.


person fancy    schedule 21.12.2011    source источник


Ответы (2)


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

actions.fetch {success: -> console.log actions.models.length}
person Trevor Burnham    schedule 21.12.2011
comment
Они отправляются с сервера через веб-сокеты. - person fancy; 21.12.2011
comment
Тот же принцип. Веб-сокеты не блокируют. Где-то есть обратный вызов, и вы не можете рассчитывать на загрузку моделей, пока не будет вызван этот обратный вызов. - person Trevor Burnham; 21.12.2011
comment
Данные веб-сокета добавляются к родительской модели, и эти события привязаны к событию добавления этого родителя. Я предположил, что событие добавления не сработает до получения данных. Если это не так, как я могу создать обратный вызов в такой ситуации? - person fancy; 21.12.2011
comment
В любом случае, спасибо за наводку, я постараюсь провести еще несколько тестов. - person fancy; 21.12.2011
comment
Вы только что сказали: вместо прямой привязки к обратному вызову WebSockets вам просто нужно привязаться к actions.on 'add'. - person Trevor Burnham; 22.12.2011
comment
Итак, вы говорите, что из обратного вызова actions.on 'add' actions.models.length равно 0? - person Trevor Burnham; 23.12.2011

Не уверен, что вы пытаетесь сделать, но в любом случае. Когда вы выгружаете объекты в журнал консоли, имейте в виду тот факт, что, поскольку объекты передаются по ссылке, все, что вы получите от проверки в журнале, будет тем, чем закончился объект. быть. Предполагая, что вы хотите регистрировать состояние объекта, вам, вероятно, следует попытаться сериализовать его при регистрации. Например console.log "mymodel: ", JSON.stringify(mymodel.attributes).

Также имейте в виду, что для доступа к магистральным моделям обычно используется name = mymodel.get('name'), а для коллекции — item = mycollection.get('someid').

Если вы опубликуете какой-нибудь тестируемый код и то, что вы пытаетесь выполнить, я уверен, что кто-то с подсказкой сможет вам помочь.

person Marius Kjeldahl    schedule 21.12.2011
comment
Я не думаю, что асинхронность console.log является ответом здесь, поскольку actions.models.length будет передаваться по значению, а не по ссылке (JSON.stringify не требуется). - person Trevor Burnham; 21.12.2011