【发布时间】:2016-07-24 04:04:55
【问题描述】:
我已经尝试调试一个烦人的问题已经有太多小时了。我目前正在使用一个名为合法调度程序的组件。调度程序接收一个名为 event 的变量,我可以在本地 Flux 存储中定义它并显示得很好。但是,当在 Mongo 数据库中定义完全相同的数据并将其连接到同一个存储时,调度程序会停止显示事件。
我正在使用 React-Render,可能是我使用的方式导致了问题。或者来自 MonogDB 的数据可能有问题。或者故障可能出在调度程序中,因为它还很年轻。
呈现此数据的文件实际上有两个组件正在使用数据。其中之一(OperationList)可以很好地呈现来自数据库的信息,但调度程序却没有。这是我注释掉从数据库中获取的代码时看到的内容
operationStore.onChange(function(items){
// events = items;
})
然后,当我取消注释 onChange 中的代码时,存储数据会按预期被 database.js 中的内容替换。但这就是发生时所看到的。
当 onChange 函数触发时,我收到以下警告
app.js:52469 Warning: [react-router] You cannot change <Router routes>; it will be ignored
为什么调度程序对数据库中的内容有问题,而我的 OperationList 工作正常?
这里是感兴趣的文件。
组件/Scheduler.jsx
var React = require('react');
var Scheduler = require('legit-scheduler/lib/scheduler');
var RangeDate = require('legit-scheduler/lib/range_date');
var Grid = require('react-bootstrap/lib/Grid')
var Row = require('react-bootstrap/lib/Row')
var Col = require('react-bootstrap/lib/Col')
var operationStore = require('./../stores/OperationStore.jsx');
var OperationList = require('./OperationList.jsx');
var resources = ['one', 'two', 'three', 'four', 'five'],
day = new Date(),
today = new RangeDate(day.setHours(8)),
events = operationStore.getItems();
module.exports = React.createClass({
render() {
return (
<Grid>
<Row className="show-grid">
<Col xs={10} md={10}>
<Col xs={2} md={2}><OperationList items={events}/></Col>
<Scheduler
from={today}
rowHeight={50}
to={today.advance('hours',10)}
resources={resources}
events={events}
width={1000}
/>
</Col>
</Row>
</Grid>
)
}
})
operationStore.onChange(function(items){
// events = items;
})
商店/OperationStore.jsx
var RangeDate = require('legit-scheduler/lib/range_date');
function operationStore(){
var day = new Date()
var today = new RangeDate(day.setHours(8))
var operations = [{
operationName: "Store",
patientName: "Adrian Garcia",
typeOfSurgery: "Open Heart",
id: 'foobar22',
title: 'From the Store',
startDate: today.advance('hours', 1).toRef(),
duration: 5,
resource: 'two'
},{
_v:0,
_id:"sdfsdffsdf",
operationName: "Stores",
patientName: "Adrian Garcia",
typeOfSurgery: "Open Heart",
id: 'foobar22',
title: 'From the 2Store',
startDate: today.advance('hours', 1).toRef(),
duration: 5,
resource: 'three'
}];
var listeners = [];
var updateOperations = function(helper){
helper.get("api/operations")
.then(function(data){
operations = data;
triggerListeners(listeners);
});
}
updateOperations(helper);
function getItems(){
return operations;
};
var onChange = function(listener){
listeners.push(listener);
return listeners;
}
...
var triggerListeners = function(listeners) {
listeners.forEach(function(listener) {
listener(operations);
})
}
return {
getItems: getItems,
onChange: onChange,
addOperationItem: addOperationItem,
deleteOperationItem: deleteOperationItem,
triggerListeners: triggerListeners,
dispatchRegister: dispatchRegister,
registerEvent: registerEvent,
updateOperations: updateOperations
}
}
module .exports = new operationStore();
服务器/数据库.js
var mongoose = require('mongoose');
var Operation = require('./models/Operation.js');
var RangeDate = require('legit-scheduler/lib/range_date');
mongoose.connect('mongodb:connection', function(){
mongoose.connection.db.dropDatabase();
var day = new Date()
var today = new RangeDate(day.setHours(8))
var operations = [{
operationName: "From the Database",
patientName: "Adrian Garcia",
typeOfSurgery: "Open Heart",
id: 'foobar',
title: 'From the Database',
startDate: today.advance('hours', 1).toRef(),
duration: 5,
resource: 'one'
}];
operations.forEach(function(operation){
new Operation(operation).save();
})
})
更新
operationStore.onChange(function(items){
console.log(events)
events = items;
console.log(events)
})
第一个日志...
Array[2]
0
:
Object
duration
:
5
id
:
"bar"
operationName
:
"Store"
patientName
:
"Adrian Garcia"
resource
:
"two"
startDate
:
"April 4, 2016, 09:20:30"
title
:
"From the Store"
typeOfSurgery
:
"Open Heart"
__proto__
:
Object
1
:
Object
duration
:
5
id
:
"foo"
operationName
:
"Store"
patientName
:
"Adrian Garcia"
resource
:
"three"
startDate
:
"April 4, 2016, 09:20:30"
title
:
"Also from Store"
typeOfSurgery
:
"Open Heart"
__proto__
:
Object
第二个日志...
Array[1]
0
:
Object
__v
:
0
_id
:
"5702b065f23b1dbc15d0280c"
duration
:
5
id
:
"foobar"
operationName
:
"From the Database"
patientName
:
"Adrian Garcia"
resource
:
"one"
startDate
:
"April 4, 2016, 09:20:21"
title
:
"From the Database"
typeOfSurgery
:
"Open Heart"
第二个日志带有两个额外的变量,__v 和 _id。它们是由 mongo 生成的,但我认为它们不会导致问题。手术清单也会有同样的结果。
【问题讨论】:
-
我将首先检查从数据库返回的
startDate。我正在使用时刻来解析传入的日期,但这可能会导致打嗝。您是否在控制台中看到任何奇怪的错误? -
控制台中没有任何内容。我检查了从商店和数据库返回的字符串,它们完全相同。当我有机会时,我可以在 onChange 之前和之后打印事件时发布控制台记录的内容。
-
我在onChange函数前后添加了日志
-
Adrian,您使用的是您修改过的版本吗?在不知道修改后的代码长什么样的情况下,我很难调试。我将此组件与 Relay 结合使用,它适用于来自数据库的更新等。
-
是的,它已修改。该团队正在使用未经修改的源,看看我们是否得到相同的结果。
标签: javascript mongodb react-router reactjs-flux