admin-on-rest:隐藏表单输入取决于其他输入值

时间:2017-03-13 12:27:36

标签: admin-on-rest

我找不到隐藏输入的方法取决于一些记录值。我试图让'user_id': fields.related( 'employee_id', 'user_id', type="many2one", relation="res.users", string="User", required=False, default=lambda self: False, store=True), 获得当前状态,但我失败了。

import { formValueSelector } from 'redux-form'

3 个答案:

答案 0 :(得分:12)

您可以使用marmelab/aor-dependent-input,它是根据其他输入值显示输入的组件。

使用示例:

import React from 'react';
import {
    Create, SimpleForm, TextInput, DisabledInput, NumberInput
} from 'admin-on-rest';
import DependentInput from 'aor-dependent-input';

const checkAge = (age) => {
    return parseInt(age, 10) > 18;
};

const UserCreate = (props) => (
    <Create {...props}>
        <SimpleForm>
            <DisabledInput source="id"/>
            <NumberInput source="age" step="1" />

            <DependentInput dependsOn="age" resolve={checkAge}>
                <TextInput source="question"/>
            </DependentInput>
        </SimpleForm>
    </Create>
);

export default UserCreate;

答案 1 :(得分:5)

record在您提交之前不会更改,因此您的解决方案无效。我相信解决方案是在自定义连接的输入组件中使用formValueSelector,如in the redux-form documentation所述。

像:

// in src/ConditionalInput.js
import React from 'react';
import { connect } from 'react-redux';
import { formValueSelector } from 'redux-form'
import { TextInput } from 'admin-on-rest/lib/mui`;

const ConditionalInput = ({ isDisplayed, condition, children, ...rest }) => 
    isDisplayed 
        ? React.cloneElement(children, rest)
        : null;

function mapStateToProps(state, props) {
    return {
        isDisplayed: props.condition(formValueSelector('record-form')),
    }
}

export default connect(mapStateToProps)(ConditionalInput);

// in your EditView
export default props => 
<Edit {...props}>
    <SimpleForm>
        <DisabledInput source="id"/>
        <NumberInput options={opts} source="age" />
        <ConditionalInput condition={selector => selector('age') > 18}>
            <TextInput options={opts} source="question"/>
        </ConditionalInput>
    </SimpleForm>
</Edit>

答案 2 :(得分:1)

François的回答非常接近并且公平地认为我不是那么干净,但我遇到了一些问题:

  • worker = fib_Worker().worker for i in range(5): p = multiprocessing.Process(target=worker, args=(i,)) jobs.append(p) p.start() 也需要状态
  • 在通过状态后,我遇到selector
  • 的问题

经过一番挖掘后,我发现被触摸的是元属性,请参阅:https://github.com/marmelab/admin-on-rest/blob/master/docs/Inputs.md。该页面指出Trying to access touched of undefined正在将<Field>meta属性传递给其子级。我试着修复弗朗索瓦的答案,但更多的改变是我关心修改他的答案。

input

向François致信,指出我与表格的正确方向。 不幸的是,使用此解决方案,您需要将每个字段包装在变量中,以便能够传递到const ConditionalChildRendering = ({isDisplayed, condition, children, ...rest}) => { return isDisplayed ? React.cloneElement(children, rest) : null; } const ConditionalInput = connect((state, props) => { return { isDisplayed: props.condition(formValueSelector('record-form'), state), } })(ConditionalChildRendering); ... let conditionalTextField = ({meta, input, name, ...rest}) => { return <ConditionalInput {...rest}> <TextInput source={name} meta={meta} input={input} {...rest} /> </ConditionalInput>; }; <Field component={conditionalTextField} name="postcode" condition={(selector,state) => selector(state, 'somefield') === 'somevalue'} /> 的{​​{1}}属性。 (但如果有人知道更好的方式,请分享,我是新来的反应)

相关问题