Bootstrap 模态填充了相同的单一值 - Meteor+React
Bootstrap modals are populated with a same single value - Meteor+React
问题 1:已解决
问题2:??
我正在学习 react+meteor+bootstrap 并使用它们为名为 portfolio 的简单模型实现 CRUD。我被 "CRUD" 中的 "U" 困住了。
代码如下
ListPortfolios = React.createClass({
mixins: [ReactMeteorData],
getMeteorData(){
return {
portfolios: portfolios.find().fetch()
};
},
renderPortfolios(){
return this.data.portfolios.map((portfolio) => {
return <PortfolioItem key={portfolio._id} portfolio={portfolio}></PortfolioItem>;
});
},
render(){
return(
<div className="panel-group">
<div className="panel panel-primary">
<div className="panel-heading">Portfolios</div>
<div className="panel-body" style={{height: 250}}>
<ul className="list-group" style={{overflowY: "scroll",maxHeight:230}}>
{this.renderPortfolios()}
</ul>
</div>
</div>
</div>
);
}
});
PortfolioItem = React.createClass({
handleEditClick(event){
console.log(event);
},
handleRemoveClick(event){
event.preventDefault();
Meteor.call("removePortfolio",this.props.portfolio._id);
},
render(){
var editBtnStyle = {
position: "absolute",
right: 100,
top: 10
};
var removeBtnStyle = {
position: "absolute",
right: 0,
top: 10
};
return(
<div>
<li className="list-group-item" >
{this.props.portfolio.name}
<a href=""
data-toggle="modal"
data-target="#myModal"
name="editBtn"
className="glyphicon glyphicon-pencil"
id={this.props.portfolio._id}
data-portfolio={this.props.portfolio}
style={editBtnStyle}
onClick={this.handleEditClick}>Edit
</a>
<a href=""
name="removeBtn"
className="glyphicon glyphicon-remove"
id={this.props.portfolio._id}
style={removeBtnStyle}
onClick={this.handleRemoveClick}>Remove
</a>
<MyModal key={this.props.key} portfolio={this.props.portfolio}/>
</li>
</div>
)
}
});
MyModal = React.createClass({
handleFormSubmit(event){
console.log(event);
event.preventDefault();
var portfolioObjToSet = Session.get("Portfolio");
//portfolioObjToSet.name = JSON.parse(event.target.dataset.portfolio).name.value;
Meteor.call("updatePortfolio",this.props.portfolio._id,portfolioObjToSet);
},
render(){
return(
<div className="modal fade" id="myModal" role="dialog">
<div className="modal-dialog">
<div className="modal-content">
<div className="modal-header">
<button type="button" className="close" data-dismiss="modal">×</button>
<h4 className="modal-title">Modal Header</h4>
</div>
<div className="modal-body">
<form role="form" onSubmit={this.handleFormSubmit}>
<input name="newPortfolioName" type="text" defaultValue={this.props.portfolio.name}/>
<button type="submit" className="btn btn-default" data-dismiss="modal" value="Done"></button>
</form>
</div>
<div className="modal-footer">
</div>
</div>
</div>
</div>
);
}
});
所以,如您所见,上面的代码包含三个 React 组件。
一个列表组件、一个 ListItem 组件和
包含 edit/update 元组的形式的模态组件。
现在,我有两个问题。
1) 当我单击特定列表项的 "Edit" 按钮时,模式打开,没问题,但是文本框中填充的值需要更新的始终是列表中第一项的值,无论我单击哪个项目的"edit button"。
2)
由于某种原因,未触发模态中存在的表单的表单提交事件。
我已经挖掘了整个代码很多次,但不知何故,我无法找到问题的原因。
解决方案
问题#1:
由于 id 已固定为 "MyModal",因此 html 只为列表的所有行创建了一个模式。
为了解决这个问题,我当然为每个列表项分别创建了一个模式,并使用了不同的 id。成功了。
解决方案
问题#1:
由于 id 已固定为 "MyModal",因此 html 只为列表的所有行创建了一个模式。
为了解决这个问题,我当然为每个列表项分别创建了一个模式,并使用了不同的 id。成功了。
已替换
<div className="modal fade" id="myModal" role="dialog">
与
<div className="modal fade" id={this.props.itemNumber} role="dialog">
其中 itemN 是一个迭代变量
问题 1:已解决
问题2:??
我正在学习 react+meteor+bootstrap 并使用它们为名为 portfolio 的简单模型实现 CRUD。我被 "CRUD" 中的 "U" 困住了。
代码如下
ListPortfolios = React.createClass({
mixins: [ReactMeteorData],
getMeteorData(){
return {
portfolios: portfolios.find().fetch()
};
},
renderPortfolios(){
return this.data.portfolios.map((portfolio) => {
return <PortfolioItem key={portfolio._id} portfolio={portfolio}></PortfolioItem>;
});
},
render(){
return(
<div className="panel-group">
<div className="panel panel-primary">
<div className="panel-heading">Portfolios</div>
<div className="panel-body" style={{height: 250}}>
<ul className="list-group" style={{overflowY: "scroll",maxHeight:230}}>
{this.renderPortfolios()}
</ul>
</div>
</div>
</div>
);
}
});
PortfolioItem = React.createClass({
handleEditClick(event){
console.log(event);
},
handleRemoveClick(event){
event.preventDefault();
Meteor.call("removePortfolio",this.props.portfolio._id);
},
render(){
var editBtnStyle = {
position: "absolute",
right: 100,
top: 10
};
var removeBtnStyle = {
position: "absolute",
right: 0,
top: 10
};
return(
<div>
<li className="list-group-item" >
{this.props.portfolio.name}
<a href=""
data-toggle="modal"
data-target="#myModal"
name="editBtn"
className="glyphicon glyphicon-pencil"
id={this.props.portfolio._id}
data-portfolio={this.props.portfolio}
style={editBtnStyle}
onClick={this.handleEditClick}>Edit
</a>
<a href=""
name="removeBtn"
className="glyphicon glyphicon-remove"
id={this.props.portfolio._id}
style={removeBtnStyle}
onClick={this.handleRemoveClick}>Remove
</a>
<MyModal key={this.props.key} portfolio={this.props.portfolio}/>
</li>
</div>
)
}
});
MyModal = React.createClass({
handleFormSubmit(event){
console.log(event);
event.preventDefault();
var portfolioObjToSet = Session.get("Portfolio");
//portfolioObjToSet.name = JSON.parse(event.target.dataset.portfolio).name.value;
Meteor.call("updatePortfolio",this.props.portfolio._id,portfolioObjToSet);
},
render(){
return(
<div className="modal fade" id="myModal" role="dialog">
<div className="modal-dialog">
<div className="modal-content">
<div className="modal-header">
<button type="button" className="close" data-dismiss="modal">×</button>
<h4 className="modal-title">Modal Header</h4>
</div>
<div className="modal-body">
<form role="form" onSubmit={this.handleFormSubmit}>
<input name="newPortfolioName" type="text" defaultValue={this.props.portfolio.name}/>
<button type="submit" className="btn btn-default" data-dismiss="modal" value="Done"></button>
</form>
</div>
<div className="modal-footer">
</div>
</div>
</div>
</div>
);
}
});
所以,如您所见,上面的代码包含三个 React 组件。 一个列表组件、一个 ListItem 组件和 包含 edit/update 元组的形式的模态组件。
现在,我有两个问题。
1) 当我单击特定列表项的 "Edit" 按钮时,模式打开,没问题,但是文本框中填充的值需要更新的始终是列表中第一项的值,无论我单击哪个项目的"edit button"。
2) 由于某种原因,未触发模态中存在的表单的表单提交事件。
我已经挖掘了整个代码很多次,但不知何故,我无法找到问题的原因。
解决方案 问题#1: 由于 id 已固定为 "MyModal",因此 html 只为列表的所有行创建了一个模式。 为了解决这个问题,我当然为每个列表项分别创建了一个模式,并使用了不同的 id。成功了。
解决方案 问题#1: 由于 id 已固定为 "MyModal",因此 html 只为列表的所有行创建了一个模式。 为了解决这个问题,我当然为每个列表项分别创建了一个模式,并使用了不同的 id。成功了。
已替换
<div className="modal fade" id="myModal" role="dialog">
与
<div className="modal fade" id={this.props.itemNumber} role="dialog">
其中 itemN 是一个迭代变量