Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 异步字段在Redux表单中不起作用_Javascript_Asynchronous_Reactjs_React Redux_Redux Form - Fatal编程技术网

Javascript 异步字段在Redux表单中不起作用

Javascript 异步字段在Redux表单中不起作用,javascript,asynchronous,reactjs,react-redux,redux-form,Javascript,Asynchronous,Reactjs,React Redux,Redux Form,我在redux表单中使用asyncBlurFields时遇到一些问题,它只是没有响应 容器: import React, { Component, PropTypes } from 'react' import { connect } from 'react-redux' import SupplierEditForm from '../../components/suppliers/SupplierEditForm' import { reduxForm, change } from 're

我在redux表单中使用asyncBlurFields时遇到一些问题,它只是没有响应

容器:

import React, { Component, PropTypes } from 'react'
import { connect } from 'react-redux'
import SupplierEditForm from '../../components/suppliers/SupplierEditForm' 
import { reduxForm, change } from 'redux-form'
import { createSupplierRequest, updateSupplierRequest, fetchSupplierInfoRequest, validateSupplierRequest } from '../../api/suppliers'
import { resetSupplierForm, supplierFormSubmitSuccess } from '../../actions/SuppliersActions'

class SuppliersEditView extends Component {
    constructor(props, context) {
        super(props, context);
        this.state = {isSubmitting: false}
    }

    componentWillMount() {
        this.props.dispatch(resetSupplierForm())
    }


    componentDidMount() {
        if(this.props.params.supplier_id) {
                   this.props.dispatch(fetchSupplierInfoRequest(this.props.params.supplier_id))
        }

    }

    componentWillReceiveProps(nextProps) {
        if(nextProps.supplier.isAction==true) {
            if(!this.props.params.supplier_id) {
            this.context.router.push('/suppliers/edit/'+nextProps.supplier.supplier_id)

        } else {
            this.props.dispatch(fetchSupplierInfoRequest(nextProps.supplier.supplier_id))
        }
        this.setState({isSubmitting:true})
        setTimeout(() => { 
            this.hideStatus()
            this.props.dispatch(supplierFormSubmitSuccess())
        }, 1500)

    }



    }

    hideStatus() {
        this.setState({isSubmitting:false})
    }

    render() {

        let pageHeader 

        if(this.props.fields.company_name.value) {
            pageHeader =  <h1 className="page-header">Suppliers - { this.props.fields.company_name.value }</h1>
        }
        else {
            pageHeader =  <h1 className="page-header">Suppliers</h1>
        }

          return (
            <div className="container-fluid">
                {pageHeader}
                <SupplierEditForm 
                fields={this.props.fields} 
                handleSubmit={this.props.handleSubmit} 
                dispatchSupplier={this.props.dispatchSupplier.bind(this)} 
                supplier={this.props.supplier.payload} 
                isSubmitting={this.state.isSubmitting} 
                dispatchFieldChange={this.props.dispatchFieldChange}
                supplier_id={this.props.params.supplier_id}
                />
            </div>
        )
    }
}


const validateSupplier = (values, dispatch) => {
    console.log('hi')
    return new Promise((resolve, reject) => {
        dispatch(validateSupplierRequest(values))
        .then((response) => {
        console.log(response)
        });
    })
}


const mapStateToProps = (state) => ({
    supplier: state.suppliers.supplierInfo,
    initialValues: state.suppliers.supplierInfo.payload

})

const mapDispatchToProps = (dispatch, props) => ({
    dispatchSupplier: (values) => {
        !props.params.supplier_id ? dispatch(createSupplierRequest(values)) :     dispatch(updateSupplierRequest(values, props.params.supplier_id))

    },
    dispatchFieldChange: (field, value) => {
        dispatch(change('SupplierEditForm',field,value))
    }
})

SuppliersEditView.propTypes = {
    asyncValidating: PropTypes.string.isRequired,
    fields: PropTypes.object.isRequired,
    resetForm: PropTypes.func.isRequired,
    handleSubmit: PropTypes.func.isRequired,
    submitting: PropTypes.bool.isRequired
}

SuppliersEditView.contextTypes = {
    router: PropTypes.object
}

SuppliersEditView = reduxForm({
    form: 'SupplierEditForm',
    fields: ['company_logo','company_name', 'business_registration_no', 'mailing_address', 'billing_address', 'phone', 'email', 'fax', 'contact_person', 'contact_phone', 'contact_email', 'comments'],
    asyncValidate: validateSupplier,
    asyncBlurFields:['business_registration_no']
})(SuppliersEditView)



export default connect(mapStateToProps, mapDispatchToProps)(SuppliersEditView)
import React, { Component } from 'react'
import { Link } from 'react-router'
import ReactDOM, { findDOMNode } from 'react-dom';
import { config } from '../../config'
import _ from 'lodash'

class SupplierEditForm extends Component {
constructor(props, context) {
    super(props, context)
    this.state = {
        file: null,
        imagePreviewUrl: null
    }
}




handleImageChange(e) {
    e.preventDefault();
    let reader = new FileReader();
    let file = e.target.files[0];

    reader.onloadend = () => {
        this.setState({
            file: file,
            imagePreviewUrl: reader.result
        })
    }
    this.props.dispatchFieldChange(['company_logo'],file)

    reader.readAsDataURL(file)
}

triggerImageUpload() {
    ReactDOM.findDOMNode(this.refs.upload).click()
}


render () {

    const { fields: { company_logo, company_name, business_registration_no, mailing_address, billing_address, phone, email, fax, contact_person, contact_phone, contact_email, comments }, handleSubmit, isSubmitting } = this.props

    let imageSection 

    if(this.state.imagePreviewUrl) {
        imageSection = <img src={this.state.imagePreviewUrl} width="100" onClick={this.triggerImageUpload.bind(this)}/>
    } else if (_.isEmpty(this.props.supplier) || _.isNull(this.props.supplier.filename)){
        imageSection = <div className="img-placeholder" onClick={this.triggerImageUpload.bind(this)}></div>
    } else if (!_.isNull(this.props.supplier.filename) || !_.isEmpty(this.props.supplier)){
        imageSection = <img src={config.FILE_DIR + this.props.supplier.filename} width="100"  onClick={this.triggerImageUpload.bind(this)}/>
    } 


    return (
        <form onSubmit={handleSubmit(this.props.dispatchSupplier)} >
            <button type="submit" disabled={isSubmitting} className="btn btn-primary mr8">
                {
                    isSubmitting == true ?
                        <i className="fa fa-circle-o-notch fa-spin fa-fw"></i>
                    :
                        'Save'
                }
            </button>
            <Link to="/suppliers" className="btn btn-secondary">Back</Link>
            <div className="row">
                {
                    isSubmitting ? 
                        <div className="form-overlay"/>
                    : null
                }
                <div className="col-md-6">
                    <h2 className="mb24">Supplier details</h2>
                    <div className="form-group">
                        <label>Company logo</label>
                        <div className="col-md-12">
                            {imageSection}
                        </div>
                        <input type="file" ref="upload" className="col-xs-12 mb24 hide" {...company_logo} value={null} onChange={this.handleImageChange.bind(this)} />
                    </div>
                    <div className="form-group">
                        <label>Company name</label>
                        <input type="text" className="col-xs-12"  {...company_name} required/>
                    </div>
                    <div className="form-group">
                        <label>Business registration no.</label>
                        <input type="text" className="col-xs-12"  {...business_registration_no} required/> 


                    </div>
                    <div className="form-group">
                        <label>Mailing address</label>
                        <input type="text" className="col-xs-12"  {...mailing_address} required/>
                    </div>
                    <div className="form-group">
                        <label>Billing address</label>
                        <input type="text" className="col-xs-12"  {...billing_address} required/>
                    </div>
                    <div className="form-group">
                        <label>Comments</label>
                        <textarea type="text" className="col-xs-12"  {...comments} required></textarea>
                    </div>
                </div>
                <div className="col-md-6">
                    <h2 className="mb24">Contact details</h2>
                    <div className="form-group">
                        <label>Phone</label>
                        <input type="text" className="col-xs-12"  {...phone} required/>
                    </div>
                    <div className="form-group">
                        <label>Fax</label>
                        <input type="text" className="col-xs-12"  {...fax} required/>
                    </div>
                    <div className="form-group">
                        <label>Email</label>
                        <input type="email" className="col-xs-12"  {...email} required/>
                    </div>
                    <div className="form-group">
                        <label>Contact person</label>
                        <input type="text" className="col-xs-12"  {...contact_person} required/>
                    </div>
                    <div className="form-group">
                        <label>Contact phone</label>
                        <input type="text" className="col-xs-12"  {...contact_phone} required/>
                    </div>
                    <div className="form-group">
                        <label>Contact email</label>
                        <input type="email" className="col-xs-12"  {...contact_email} required/>
                    </div>
                </div>
            </div>
        </form>
    )
}


}



export default SupplierEditForm
import React,{Component,PropTypes}来自“React”
从“react redux”导入{connect}
从“../../components/suppliers/SupplierEditForm”导入SupplierEditForm
从'redux form'导入{reduxForm,change}
从“../../api/suppliers”导入{createSupplierRequest,updateSupplierRequest,fetchSupplierInfoRequest,validateSupplierRequest}
从“../../actions/SuppliersActions”导入{resetSupplierForm,supplierFormSubmitSuccess}
类SuppliersEditView扩展组件{
构造函数(道具、上下文){
超级(道具、背景);
this.state={isSubmitting:false}
}
组件willmount(){
this.props.dispatch(resetSupplierForm())
}
componentDidMount(){
if(此属性参数供应商id){
this.props.dispatch(fetchSupplierInfoRequest(this.props.params.supplier_id))
}
}
组件将接收道具(下一步){
if(nextrops.supplier.isAction==true){
如果(!this.props.params.supplier_id){
this.context.router.push('/suppliers/edit/'+nextrops.supplier.supplier_id)
}否则{
this.props.dispatch(fetchSupplierInfoRequest(nextrops.supplier.supplier\u id))
}
this.setState({isSubmitting:true})
setTimeout(()=>{
这是hideStatus()
this.props.dispatch(supplierFormSubmitSuccess())
}, 1500)
}
}
希德斯塔斯(){
this.setState({isSubmitting:false})
}
render(){
让页面标题
if(this.props.fields.company_name.value){
pageHeader=供应商-{this.props.fields.company_name.value}
}
否则{
pageHeader=供应商
}
返回(
{pageHeader}
)
}
}
const validateSupplier=(值,分派)=>{
console.log('hi')
返回新承诺((解决、拒绝)=>{
分派(验证供应商请求(值))
。然后((响应)=>{
console.log(响应)
});
})
}
常量mapStateToProps=(状态)=>({
供应商:state.suppliers.supplierInfo,
初始值:state.suppliers.supplierInfo.payload
})
const mapDispatchToProps=(调度,道具)=>({
派遣供应商:(值)=>{
!props.params.supplier_id?分派(createSupplierRequest(值)):分派(updateSupplierRequest(值,props.params.supplier_id))
},
dispatchFieldChange:(字段,值)=>{
分派(更改('SupplierEditForm',字段,值))
}
})
SuppliersEditView.propTypes={
asyncValidating:PropTypes.string.isRequired,
字段:PropTypes.object.isRequired,
resetForm:PropTypes.func.isRequired,
handleSubmit:PropTypes.func.isRequired,
提交:PropTypes.bool.isRequired
}
SuppliersEditView.contextTypes={
路由器:PropTypes.object
}
SuppliersEditView=reduxForm({
表格:'供应商编辑表格',
字段:[“公司标志”、“公司名称”、“商业登记号”、“邮寄地址”、“账单地址”、“电话”、“电子邮件”、“传真”、“联系人”、“联系人电话”、“联系人电子邮件”、“评论”],
asyncValidate:validateSupplier,
asyncBlurFields:[“商业登记号”]
})(供应商视图)
导出默认连接(MapStateTrops、mapDispatchToProps)(供应商编辑视图)
组件:

import React, { Component, PropTypes } from 'react'
import { connect } from 'react-redux'
import SupplierEditForm from '../../components/suppliers/SupplierEditForm' 
import { reduxForm, change } from 'redux-form'
import { createSupplierRequest, updateSupplierRequest, fetchSupplierInfoRequest, validateSupplierRequest } from '../../api/suppliers'
import { resetSupplierForm, supplierFormSubmitSuccess } from '../../actions/SuppliersActions'

class SuppliersEditView extends Component {
    constructor(props, context) {
        super(props, context);
        this.state = {isSubmitting: false}
    }

    componentWillMount() {
        this.props.dispatch(resetSupplierForm())
    }


    componentDidMount() {
        if(this.props.params.supplier_id) {
                   this.props.dispatch(fetchSupplierInfoRequest(this.props.params.supplier_id))
        }

    }

    componentWillReceiveProps(nextProps) {
        if(nextProps.supplier.isAction==true) {
            if(!this.props.params.supplier_id) {
            this.context.router.push('/suppliers/edit/'+nextProps.supplier.supplier_id)

        } else {
            this.props.dispatch(fetchSupplierInfoRequest(nextProps.supplier.supplier_id))
        }
        this.setState({isSubmitting:true})
        setTimeout(() => { 
            this.hideStatus()
            this.props.dispatch(supplierFormSubmitSuccess())
        }, 1500)

    }



    }

    hideStatus() {
        this.setState({isSubmitting:false})
    }

    render() {

        let pageHeader 

        if(this.props.fields.company_name.value) {
            pageHeader =  <h1 className="page-header">Suppliers - { this.props.fields.company_name.value }</h1>
        }
        else {
            pageHeader =  <h1 className="page-header">Suppliers</h1>
        }

          return (
            <div className="container-fluid">
                {pageHeader}
                <SupplierEditForm 
                fields={this.props.fields} 
                handleSubmit={this.props.handleSubmit} 
                dispatchSupplier={this.props.dispatchSupplier.bind(this)} 
                supplier={this.props.supplier.payload} 
                isSubmitting={this.state.isSubmitting} 
                dispatchFieldChange={this.props.dispatchFieldChange}
                supplier_id={this.props.params.supplier_id}
                />
            </div>
        )
    }
}


const validateSupplier = (values, dispatch) => {
    console.log('hi')
    return new Promise((resolve, reject) => {
        dispatch(validateSupplierRequest(values))
        .then((response) => {
        console.log(response)
        });
    })
}


const mapStateToProps = (state) => ({
    supplier: state.suppliers.supplierInfo,
    initialValues: state.suppliers.supplierInfo.payload

})

const mapDispatchToProps = (dispatch, props) => ({
    dispatchSupplier: (values) => {
        !props.params.supplier_id ? dispatch(createSupplierRequest(values)) :     dispatch(updateSupplierRequest(values, props.params.supplier_id))

    },
    dispatchFieldChange: (field, value) => {
        dispatch(change('SupplierEditForm',field,value))
    }
})

SuppliersEditView.propTypes = {
    asyncValidating: PropTypes.string.isRequired,
    fields: PropTypes.object.isRequired,
    resetForm: PropTypes.func.isRequired,
    handleSubmit: PropTypes.func.isRequired,
    submitting: PropTypes.bool.isRequired
}

SuppliersEditView.contextTypes = {
    router: PropTypes.object
}

SuppliersEditView = reduxForm({
    form: 'SupplierEditForm',
    fields: ['company_logo','company_name', 'business_registration_no', 'mailing_address', 'billing_address', 'phone', 'email', 'fax', 'contact_person', 'contact_phone', 'contact_email', 'comments'],
    asyncValidate: validateSupplier,
    asyncBlurFields:['business_registration_no']
})(SuppliersEditView)



export default connect(mapStateToProps, mapDispatchToProps)(SuppliersEditView)
import React, { Component } from 'react'
import { Link } from 'react-router'
import ReactDOM, { findDOMNode } from 'react-dom';
import { config } from '../../config'
import _ from 'lodash'

class SupplierEditForm extends Component {
constructor(props, context) {
    super(props, context)
    this.state = {
        file: null,
        imagePreviewUrl: null
    }
}




handleImageChange(e) {
    e.preventDefault();
    let reader = new FileReader();
    let file = e.target.files[0];

    reader.onloadend = () => {
        this.setState({
            file: file,
            imagePreviewUrl: reader.result
        })
    }
    this.props.dispatchFieldChange(['company_logo'],file)

    reader.readAsDataURL(file)
}

triggerImageUpload() {
    ReactDOM.findDOMNode(this.refs.upload).click()
}


render () {

    const { fields: { company_logo, company_name, business_registration_no, mailing_address, billing_address, phone, email, fax, contact_person, contact_phone, contact_email, comments }, handleSubmit, isSubmitting } = this.props

    let imageSection 

    if(this.state.imagePreviewUrl) {
        imageSection = <img src={this.state.imagePreviewUrl} width="100" onClick={this.triggerImageUpload.bind(this)}/>
    } else if (_.isEmpty(this.props.supplier) || _.isNull(this.props.supplier.filename)){
        imageSection = <div className="img-placeholder" onClick={this.triggerImageUpload.bind(this)}></div>
    } else if (!_.isNull(this.props.supplier.filename) || !_.isEmpty(this.props.supplier)){
        imageSection = <img src={config.FILE_DIR + this.props.supplier.filename} width="100"  onClick={this.triggerImageUpload.bind(this)}/>
    } 


    return (
        <form onSubmit={handleSubmit(this.props.dispatchSupplier)} >
            <button type="submit" disabled={isSubmitting} className="btn btn-primary mr8">
                {
                    isSubmitting == true ?
                        <i className="fa fa-circle-o-notch fa-spin fa-fw"></i>
                    :
                        'Save'
                }
            </button>
            <Link to="/suppliers" className="btn btn-secondary">Back</Link>
            <div className="row">
                {
                    isSubmitting ? 
                        <div className="form-overlay"/>
                    : null
                }
                <div className="col-md-6">
                    <h2 className="mb24">Supplier details</h2>
                    <div className="form-group">
                        <label>Company logo</label>
                        <div className="col-md-12">
                            {imageSection}
                        </div>
                        <input type="file" ref="upload" className="col-xs-12 mb24 hide" {...company_logo} value={null} onChange={this.handleImageChange.bind(this)} />
                    </div>
                    <div className="form-group">
                        <label>Company name</label>
                        <input type="text" className="col-xs-12"  {...company_name} required/>
                    </div>
                    <div className="form-group">
                        <label>Business registration no.</label>
                        <input type="text" className="col-xs-12"  {...business_registration_no} required/> 


                    </div>
                    <div className="form-group">
                        <label>Mailing address</label>
                        <input type="text" className="col-xs-12"  {...mailing_address} required/>
                    </div>
                    <div className="form-group">
                        <label>Billing address</label>
                        <input type="text" className="col-xs-12"  {...billing_address} required/>
                    </div>
                    <div className="form-group">
                        <label>Comments</label>
                        <textarea type="text" className="col-xs-12"  {...comments} required></textarea>
                    </div>
                </div>
                <div className="col-md-6">
                    <h2 className="mb24">Contact details</h2>
                    <div className="form-group">
                        <label>Phone</label>
                        <input type="text" className="col-xs-12"  {...phone} required/>
                    </div>
                    <div className="form-group">
                        <label>Fax</label>
                        <input type="text" className="col-xs-12"  {...fax} required/>
                    </div>
                    <div className="form-group">
                        <label>Email</label>
                        <input type="email" className="col-xs-12"  {...email} required/>
                    </div>
                    <div className="form-group">
                        <label>Contact person</label>
                        <input type="text" className="col-xs-12"  {...contact_person} required/>
                    </div>
                    <div className="form-group">
                        <label>Contact phone</label>
                        <input type="text" className="col-xs-12"  {...contact_phone} required/>
                    </div>
                    <div className="form-group">
                        <label>Contact email</label>
                        <input type="email" className="col-xs-12"  {...contact_email} required/>
                    </div>
                </div>
            </div>
        </form>
    )
}


}



export default SupplierEditForm
import React,{Component}来自“React”
从“反应路由器”导入{Link}
从“react dom”导入ReactDOM,{findDOMNode};
从“../../config”导入{config}
从“lodash”导入
类SupplierEditForm扩展组件{
构造函数(道具、上下文){
超级(道具、背景)
此.state={
文件:null,
imagePreviewUrl:null
}
}
handleImageChange(e){
e、 预防默认值();
let reader=new FileReader();
让file=e.target.files[0];
reader.onloadend=()=>{
这是我的国家({
档案:档案,
imagePreviewUrl:reader.result
})
}
this.props.dispatchFieldChange(['company_logo',file)
reader.readAsDataURL(文件)
}
triggerImageUpload(){
ReactDOM.findDOMNode(this.refs.upload)。单击()
}
渲染(){
const{字段:{公司标志、公司名称、商业登记号、邮寄地址、账单地址、电话、电子邮件、传真、联系人、联系人电话、联系人电子邮件、评论}、handleSubmit、isSubmitting}=this.props
让我们来看看图像部分
if(this.state.imagePreviewUrl){
imageSection=
}else如果(u.isEmpty(this.props.supplier)| 124; isNull(this.props.supplier.filename)){
imageSection=
}如果(!.props.supplier.filename)为空(this.props.supplier.filename);(this.props.isEmpty)(this.props.supplier)){
imageSection=
} 
返回(
{
isSubmitting==真?
:
“保存”
}
返回
{
提交申请?
:null
}
供应商详细信息
公司标志
{imageSection}
公司名称
商业登记号码。
通讯地址
帐单地址
评论