2015-09-30 2 views
0

Обновление: Эта проблема, похоже, связана с mongoose. См. Обновление внизу.Mongoose, array in object

В родителю я использую следующий код, чтобы передать choosenItem в Внук:

childContextTypes: { 
     foo: React.PropTypes.object.isRequired, 
     }, 

    getChildContext: function() { 
     return { foo: this.state.choosenDriver } 
    }, 

choosenDriver является mongoose модель, которая выглядит следующим образом:

var Schema = mongoose.Schema; 
var driverSchema = new mongoose.Schema({ 

    driver: String, 
    age: String, 
    cars: [{ type: Schema.Types.ObjectId, ref: 'Car' }] 

}); 
module.exports = mongoose.model('Driver', driverSchema); 

Это прекрасно работает и в Grandchild Я могу сделать следующее:

contextTypes: { 
     foo: React.PropTypes.object.isRequired, 
    }, 

//some other stuff... 

render: function(){ 
    return (
      <h1>{this.context.foo.name}</h1> 
     ) 
}); 

И это отображает имя choosenDriver.

Я также хотел бы, чтобы перебрать автомобилей и думал, что это можно было бы сделать так:

render: function(){ 

    var cars = new Array(this.context.foo.cars); 
    var driversCars = cars.map(function(car,i){ 
    return <li key={i}> {car} </li>; 
    }); 
    return (
     <div> 
      <h1>{this.context.foo.name}</h1> 
      <ul>{driversCars}</ul> 
     </div> 

) 
} 

}); 

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

Возможно ли это потому, что choosenDriver является state, и массивы не поддерживаются таким образом?

Автомобили, очевидно, существуют, но не как массив.

Любые идеи о том, как получить доступ к автомобилям в качестве массива в этом примере?

Спасибо!

Update:

При взгляде на this.context.foo.cars в реагирующих-Tools я вижу это:

cars: 
->_proto_ :{..} 
0: "4242594395935934", 
1: "3543435095340509" 
etc... 

cars should be an Array so I would expect to see: 
cars: Array[4] 

Allthough в everythingg DB выглядит, как должно:

"cars":["5607b0747eb3eefc225aed61","5607b07a7eb3eefc225aed62","5606bf4b0e76916c1d1668b4","5607b07a7eb3eefc225aed62"]}] 

Последнее обновление: Здесь они находятся рядом с eachother, я реагирую Tools: (У меня есть список драйверов, и это показывает, что объект-драйвер меняет, когда i t выбирается)

State: 
choosenDriver: {..} 
_v:0 
_id: "235345353453" 
name: "Roger" 
cars: 
    ->_proto_ :{..} 
    0: "4242594395935934", 
    _id: undefined 


Same driver but not choosen: 
drivers: array[3] 
->0: {} 
->1: {} 
     _v: 0 
     _id: "4242594395935934" 
     cars: Array[1] 

Так что что-то происходит с массивом, когда он выбирается. Weird ...

+0

Объект React может обрабатывать массивы в их состоянии без проблем, возможно, вы можете добавить тег moongose ​​на эти вопросы, я уверен, что проблема там. –

+0

Вы имеете в виду 'cars', это не Array или' this.context.foo.cars' не является массивом? – pherris

ответ

1

Если вы имеете в виду cars не массив вы ожидаете (и не this.context.foo.cars) ...

Конструктора массива создает массив с каждым аргументом конструктору в качестве элемента возвращаемого массива.

Таким образом, new Array([1,2,3]) дает вам: [[1,2,3]].

Вы хотите Array.from([1,2,3]), который даст вам [1,2,3], который, как представляется, является тем, что вы хотите.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

Но с кодом, почему вы не можете просто пропустить создание промежуточного массива и просто позвонить this.context.foo.cars.map(...) напрямую?

+0

Да, this.context.foo.cars.map (...) была моей первой попыткой, но она возвращает: не может прочитать свойство 'map' of undefined. Поэтому я думаю, что автомобили не являются «надлежащим» массивом, как предлагает вышеприведенный комментарий. – RogerDore

+0

Хорошо, этот ответ на самом деле не применяется, но я оставлю его, потому что тот факт, что 'this.context.foo.cars'' undefined', а не что-то еще, очень важен для вашего вопроса - вы должны обновить эту деталь и тогда я удалю этот ответ. – pherris

+0

Спасибо, я обновил вопрос, чтобы лучше отразить фактическую проблему. – RogerDore