【发布时间】:2015-12-05 13:25:15
【问题描述】:
我想要什么:
我想创建一个模态表单以编辑表格。
我单击表格行末尾的编辑,打开一个模态表单,我可以编辑我的输入值,然后保存或关闭。
但是我想,当我在我的模态中更新我的表单时, ==> 模态后面的表格会自行更新。
我做了什么:
一切正常,除了我的表的“实时”更新。
我的代码:
const Trigger = React.createClass({
getInitialState() {
return {
show: false,
name: this.props.name,
start: this.props.start,
end: this.props.end,
id: this.props.id
};
},
save: function(){
var data = {
name: this.state.name,
start: this.state.start,
end: this.state.end,
id: this.state.id
};
$.ajax({
...
});
},
handleNameChange: function(event) {
this.setState({ name: event.target.value });
},
handleStartChange: function(event) {
this.setState({ start: event.target.value });
},
handleEndChange: function(event) {
this.setState({ end: event.target.value });
},
render() {
let close = () => this.setState({ show: false});
var name = this.state.name;
var start = this.state.start;
var end = this.state.end;
return (
<div className="modal-container">
<Button
bsStyle="primary"
bsSize="large"
onClick={() => this.setState({ show: true})}
>
Edit
</Button>
<Modal
show={this.state.show}
onHide={close}
container={this}
aria-labelledby="contained-modal-title"
>
<Modal.Header closeButton>
<Modal.Title id="contained-modal-title">Edit Presentation</Modal.Title>
</Modal.Header>
<Modal.Body>
<form className="form-horizontal">
<Input type="text" label="Name" labelClassName="col-xs-2" wrapperClassName="col-xs-10" value={name} onChange={this.handleNameChange}/>
<Input type="text" label="Start" labelClassName="col-xs-2" wrapperClassName="col-xs-10" value={start} onChange={this.handleStartChange}/>
<Input type="text" label="End" labelClassName="col-xs-2" wrapperClassName="col-xs-10" value={end} onChange={this.handleEndChange}/>
</form>
</Modal.Body>
<Modal.Footer>
<Button onClick={this.save}>Save</Button>
<Button onClick={close}>Close</Button>
</Modal.Footer>
</Modal>
</div>
);
}
});
var Presentations = React.createClass({
mixins: [React.addons.LinkedStateMixin],
loadPresentationsFromServer: function(){
AJAX...
this.setState({presentations_parse: data});
},
getInitialState: function() {
return {
presentations_parse: []
};
},
componentDidMount: function() {
this.loadPresentationsFromServer();
setInterval(this.loadPresentationsFromServer, this.props.pollInterval);
},
render: function(){
var presentations = this.state.presentations_parse.map(function(presentation) {
return (
<tr key={presentation.objectId}>
<td >#</td>
<td >{presentation.name}</td>
<td >{presentation.start.iso}</td>
<td >{presentation.end.iso}</td>
<td ><Trigger id={presentation.objectId} name={presentation.name} start={presentation.start.iso} end={presentation.end.iso}/></td>
</tr>
);
});
const tableInstance = (
<Table striped bordered condensed hover>
<thead>
<tr>
<th>#</th>
<th>Name</th>
<th>Start</th>
<th>End</th>
<th>Edit</th>
</tr>
</thead>
<tbody>
{presentations}
</tbody>
</Table>
);
return (
tableInstance
);
}}
);
问题:
我尝试使用 linkState,我包含了mixins: [React.addons.LinkedStateMixin]。
我在地图函数中写了valueLink={this.linkState('presentation.name')}。
问题是 this.linkState 是未定义的。
我不知道如何实现this.linkState('...?...'),在哪里写,因为我使用了一个map函数。
我不知道如何将 linkState 与演示文稿联系起来。 (演示s = {演示1,演示2,演示n})
编辑 1
问题不是来自 LinkedStateMixin,因为我尝试了这段代码并且它有效:
var DisplayContainer2 = React.createClass({
mixins: [React.addons.LinkedStateMixin],
getInitialState:function(){
return{
value:'My Value'
}
},
render:function(){
return (
<div className="DisplayContainer">
<h4>{this.state.value}</h4>
<InputBox2 valueLink={this.linkState('value')} />
</div>
);
}
});
var InputBox2 = React.createClass({
render:function(){
return (<input type="text" valueLink={this.props.valueLink} />)
}
});
所以我认为是因为我在map函数中写了this.linkState。
但是我不知道在哪里写它。
有什么想法吗?
编辑 2:
我在这里更改了我的代码,以在地图中使用可选的 thisArg 参数。
我明白这个问题,我不再有这个问题this.linkState is undefined。
但是另外两个问题:
- 未捕获的错误:缩小的异常
- 如何使用多个linkState?我想为表格的每一列使用一个。
【问题讨论】:
-
你确定你的 mixin 正确吗?根据文档,您似乎必须单独安装它并获取模块。 var LinkedStateMixin = require('react-addons-linked-state-mixin');
-
是的,我确定 mixin 已正确安装。另一个代码有效。 (参见帖子中的 EDIT 1)
-
记住
.map为传递给它的函数创建了一个新的上下文,而this并不指向你认为它所做的事情,除非你使用map(function(...) { ... }.bind(this)),使用可选的@987654331 @ 参数到map,或者,如果使用 ES6,则使用箭头函数。有关详细信息,请参阅this SO question/answer。
标签: javascript forms twitter-bootstrap reactjs modal-dialog