Vue: 동적 v-model μ§€μ‹œλ¬Έ

에 λ§Œλ“  2015λ…„ 07μ›” 16일  Β·  42μ½”λ©˜νŠΈ  Β·  좜처: vuejs/vue

ν˜„μž¬ v-model μ§€μ‹œλ¬Έμ€ 바인딩 ν‘œν˜„μ‹μ— λŒ€ν•œ μ½§μˆ˜μ—Ό μœ ν˜• 바인딩을 μ§€μ›ν•˜μ§€ μ•Šμ§€λ§Œ 이 κΈ°λŠ₯은 양식 λΉŒλ”μ™€ 같은 κ΅¬ν˜„μ„ λ§Œλ“œλŠ” 데 맀우 μœ μš©ν•©λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

v-model="form[field.name]" 이미 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  42 λŒ“κΈ€

μ–΄λ–€ 점에 도움이 λ˜λŠ”μ§€ 예λ₯Ό λ“€μ–΄μ£Όμ‹€ 수 μžˆμŠ΅λ‹ˆκΉŒ?

DESCRIBE TABLE λ¬Έμ—μ„œ 데이터λ₯Ό μˆ˜μ‹ ν•˜κ³  ν•΄λ‹Ή λ°μ΄ν„°μ—μ„œ ν–‰ νŽΈμ§‘κΈ° 양식을 μž‘μ„±ν•˜λŠ” phpmyadmin의 λ³΅μ œλ³Έμ„ λΉŒλ“œν•œλ‹€κ³  κ°€μ •ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. 이 경우 바인딩 ν‘œν˜„μ‹μ€ 본질적으둜 λ™μ μž…λ‹ˆλ‹€. SQL DESCRIBE TABLE을 μ‹€ν–‰ν•œ ν›„μ—λ§Œ ν•„λ“œ 이름을 μ•Œ 수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

+1, λ‚˜λ„ 이것을 μ°Ύκ³  μžˆμŠ΅λ‹ˆλ‹€

+1, 이것을 λ³Ό 수 있기λ₯Ό λ°”λžλ‹ˆλ‹€.

λ‚˜λŠ” 이것이 ν˜„μž¬ ꡬ문이 달성할 수 μ—†λŠ” 것을 κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” 것을 μ—¬μ „νžˆ μ™„μ „νžˆ μ΄ν•΄ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. 일뢀 μ½”λ“œ μƒ˜ν”Œ?

μœ„μ—μ„œ μ„€λͺ…ν•œ phpmyadmin λ³΅μ œμ™€ κ΄€λ ¨λœ 일뢀 μ˜μ‚¬ μ½”λ“œ:

    <script>
    modue.exports = {
        data: function(){
            //returns table structure pulled from the backend somehow
            return {fields: [
                {name: "id", type: "integer"},
                {name: "name", type: "varchar"},
                {name: "gender", type: "varchar"}
            ], 
            // this was initialised based on the structure above, does not matter how.
            form: {id: null, name: null, gender: null}); 
        },
       methods: {
          getBindingExpr: function(field){ /* blah-blah */ }
       }

    }
    </script>
    <template>
       <div v-repeat="field: fields">
          <!-- Here we need to display an editor bound to the field -->
           <input type="text" v-model="form.{{field.name}}">
        <!-- Or, we can call a function that calculates the binding expression --
          <input type="text" v-model="{{getBindingExpr(field)}}">
      </div>
    </template>

v-model="form[field.name]" 이미 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μš°λ¦¬λŠ” ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? μš°μ™€ !

evan todo-ish 예제λ₯Ό λ³΄μ—¬μ£ΌλŠ” js λ°”μ΄μ˜¬λ¦°μ„ 올렀 쀄 수 μžˆμŠ΅λ‹ˆκΉŒ?

@yyx990803 , ν›Œλ₯­ν•˜μ§€λ§Œ 동적 μ‚¬μš©μ˜ ν•œ 예λ₯Ό λ³΄μ—¬μ£ΌλŠ” 예일 λΏμž…λ‹ˆλ‹€. λ…Όλ¦¬λŠ” μΌμ’…μ˜ λΉ„μ¦ˆλ‹ˆμŠ€ μ‘μš© ν”„λ‘œκ·Έλž¨μ—μ„œ 더 λ³΅μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λΆ„λͺ…νžˆ λ‚˜λŠ” β€‹β€‹μ§€μ‹œμ–΄ ν‘œν˜„μ‹ λ‚΄μ—μ„œ 보간을 ν—ˆμš©ν•˜λŠ” 아이디어에 λ°˜λŒ€ν•©λ‹ˆλ‹€. ν˜„μž¬ μ½§μˆ˜μ—Όμ€ ν‰κ°€λœ κ²°κ³Όκ°€ λ¬Έμžμ—΄λ‘œ μ˜ˆμƒλ˜κ³  λ¬Έμžμ—΄λ‘œ μ‚¬μš©λ¨μ„ μ˜λ―Έν•©λ‹ˆλ‹€(DOM에 μ‚½μž…ν•˜κ±°λ‚˜ ID 쑰회λ₯Ό μˆ˜ν–‰ν•¨). μ½§μˆ˜μ—Όμ„ 평가할 수 μžˆλŠ” ν‘œν˜„μ‹μœΌλ‘œ ν‰κ°€ν•˜λ©΄ 두 개의 좔상화 계측이 λ§Œλ“€μ–΄μ§€κ³  κ²°κ΅­ ν…œν”Œλ¦Ώμ„ 맀우 ν˜Όλž€μŠ€λŸ½κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

ν‘œν˜„μ‹μ„ ν‰κ°€ν•˜κΈ° 전에 λ¬Έμžμ—΄μ„ λ³΄κ°„ν•˜λŠ” κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” 것이 맀우 κ°€μΉ˜ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

data[pathString] λ©”μ„œλ“œλŠ” 쀑첩 μˆ˜μ€€μ΄ 1인 κ°œμ²΄μ— λŒ€ν•΄ 잘 μž‘λ™ν•˜μ§€λ§Œ 2 μ΄μƒμ˜ 경우 λ™μ μœΌλ‘œ λ°”μΈλ”©ν•˜λŠ” 방법을 찾지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

μ½§μˆ˜μ—Όλ³΄λ‹€ 더 λͺ…ν™•ν•˜λ„λ‘ 바인딩에 μˆ˜μ •μžλ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ

let myData = {}
let varPath = 'myData.path.to["my"].obj'
let modelPath = 'myData.path.to["my"].model'
<component-name :myparam.interpolate='varPath'></component-name>
<input v-model.interpolate='modelPath'>

λ˜λŠ” 전달할 수 μžˆλŠ” getter/setter ν•¨μˆ˜μΌ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ©΄μ±… μ‘°ν•­: λ‚˜λŠ” 2.0 사양을 읽지 μ•Šμ•˜μœΌλ―€λ‘œ μ—¬κΈ°μ—μ„œ 이 문제λ₯Ό ν•΄κ²°ν–ˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

@bhoriuchi μ™œ 계산 속성이 μ—†μŠ΅λ‹ˆκΉŒ?

computed: {
  varPath: function() {
    return this.myData.path.to['my'].obj;
  },
},
<component-name :myparam="varPath"></component-name>

그리고 v-model 경우 setter와 ν•¨κ»˜ κ³„μ‚°λœ 속성을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@simplesmiler μ–‘λ°©ν–₯ λ°”μΈλ”©μ—μ„œ κ³„μ‚°λœ 속성을 μ‹œλ„ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. 팁 κ³ λ§ˆμ›Œ.

μ—…λ°μ΄νŠΈ

@simplesmiler - κ³„μ‚°λœ 속성을 μ‚¬μš©ν•  λ•Œ λ°œμƒν•˜λŠ” λ¬Έμ œλŠ” κ³„μ‚°λœ 속성에 인수λ₯Ό 전달할 방법이 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. getter λ‚΄λΆ€μ˜ this λ˜λŠ” value 의 get(value) λ‘˜ λ‹€ ꡬ성 μš”μ†Œλ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.

λ‚΄ μ‚¬μš© 사둀에 λŒ€ν•œ λͺ‡ 가지 λ°°κ²½.

json 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ 양식을 μž‘μ„±ν•˜λŠ” 양식 μž‘μ„±κΈ°λ₯Ό λ§Œλ“€κ³  μžˆμŠ΅λ‹ˆλ‹€. ꡬ성 κ°œμ²΄λŠ” 개체(ν–‰/양식)의 2차원 λ°°μ—΄μž…λ‹ˆλ‹€. 각 양식 ꡬ성 κ°œμ²΄μ—λŠ” μ„€μ •ν•΄μ•Ό ν•˜λŠ” ν•„λ“œμ— λŒ€ν•œ 경둜 λ¬Έμžμ—΄μ΄ μžˆλŠ” λͺ¨λΈ ν•„λ“œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이에 λŒ€ν•΄ κ³„μ‚°λœ 속성을 μ‚¬μš©ν•˜λ €λ©΄ ꡬ성 κ°œμ²΄μ—μ„œ λͺ¨λΈ 경둜λ₯Ό μ‘°νšŒν•˜κΈ° μœ„ν•΄ ꡬ성 μš”μ†Œ 바인딩을 μ‚¬μš©ν•˜μ—¬ ꡬ성 μš”μ†Œμ—μ„œ μ–΄λ–€ ν–‰/양식 색인을 κ²°μ •ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

ν˜„μž¬ formData λΌλŠ” 미리 μ΄ˆκΈ°ν™”λœ 2차원 배열을 μ‚¬μš©ν•˜μ—¬ 이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 배열은 각 양식 λͺ¨λΈμ„ v-model="formData[rowIndex][formIndex]" λ°”μΈλ”©ν•˜κ³  ν•΄λ‹Ή κ°œμ²΄μ—μ„œ λ³€κ²½ 사항을 ν™•μΈν•˜κ³  μƒμœ„ 데이터 개체λ₯Ό μ—…λ°μ΄νŠΈν•˜μ§€λ§Œ μ €λŠ” 동적 ν•„λ“œ μΆ”κ°€λ₯Ό μœ„ν•΄ 배열을 미리 μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— 이 μ ‘κ·Ό 방식을 μ‹«μ–΄ν•©λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같은 개체λ₯Ό μ„€μ •ν•΄μ•Ό ν•˜λŠ” λ‹€λ₯Έ ꡬ성 μš”μ†Œμ—μ„œ 이 양식 μž‘μ„±κΈ° ꡬ성 μš”μ†Œλ₯Ό μ‚¬μš©ν•˜κ³  있기 λ•Œλ¬Έμ— 2λ‹¨κ³„μ˜ 쀑첩이 ν•„μš”ν•©λ‹ˆλ‹€.

data: {
  templates: {
    operatingSystems: {
      <someuuid1>: [ <osid1>, <osid2> ],
      <someuuid2>: [ <osid5>, <osid10>, <osid22> ]
   }
  }
}

λ‚΄ 경둜 λ¬Έμžμ—΄μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

templates.operatingSystems[<dynamic uuid>]

μ—…λ°μ΄νŠΈ 2

닀차원 배열을 μ‚¬μš©ν•˜λŠ” κ²ƒμ—μ„œ ν‚€ 이름이 μžˆλŠ” 일반 객체둜 λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€.

"<rowIndex>_<formIndex>"

데이터λ₯Ό λΆ€λͺ¨μ™€ λ™κΈ°ν™”λœ μƒνƒœλ‘œ μœ μ§€ν•˜κΈ° μœ„ν•΄ λ”₯ μ›ŒμΉ˜λ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” μ—¬μ „νžˆ interoplated λ°”μΈλ“œκ°€ μœ μ΅ν•  것이라고 μƒκ°ν•©λ‹ˆλ‹€.

+1

μ €μ—κ²ŒλŠ” v-model="$data[field.name]" 이 νŠΈλ¦­μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€!

@victorwpbastos 이것은 field.name을 ν‚€λ‘œ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 깊이 μ€‘μ²©λœ 객체λ₯Ό μ„€μ •ν•˜λŠ” 데 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ λ‹€μŒ 데이터와 ν•„λ“œ λ¬Έμžμ—΄μ΄ μžˆλŠ” 경우

$data = {
  'animal': {
    'dog': {
      'husky': 1
    }
  }
}
field.name = 'animal.dog.husky'

그리고 당신은 μ‚¬μš©

v-model="$data[field.name]"

양식에 κ°’ 2λ₯Ό μž…λ ₯ν•˜λ©΄ 데이터가 λ‹€μŒκ³Ό 같이 ν‘œμ‹œλ©λ‹ˆλ‹€.

$data = {
  'animal': {
    'dog': {
      'husky': 1
    }
  },
 'animal.dog.husky': 2
}

λ³΄κ°„λœ λ°”μΈλ“œκ°€ μœ μš©ν•œ μ΄μœ λŠ” λΆ€λͺ¨ 경둜(예: 'animal.dog')λ₯Ό μ§€μ‹œλ¬Έμ— "ν•˜λ“œ μ½”λ”©"ν•  수 μ—†λŠ” 동적 쀑첩 μž…λ ₯을 κ΅¬μΆ•ν•˜λŠ” κ²½μš°μž…λ‹ˆλ‹€.

λ‚˜λŠ” 이것을 λ‹€μ‹œ λ°©λ¬Έν•˜μ—¬ 더 κ°„λ‹¨ν•œ 해결책을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. μ‚¬μš©μž μ •μ˜ 개체λ₯Ό λ§Œλ“€κ³  λͺ¨λΈ 경둜 λ¬Έμžμ—΄μ„ μ‚¬μš©ν•˜μ—¬ μƒμ„±λœ κ°œμ²΄μ— getter/setterλ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ κ°„λ‹¨ν•œ μ˜ˆμž…λ‹ˆλ‹€.

μž…λ ₯ λͺ©λ‘

<template lang="jade">
  div
    div(v-for="form in config.forms")
      input(v-model="formData[form.model]")
</template>

<script type="text/babel">
  import Vue from 'vue'
  import _ from 'lodash'

  export default {
    props: ['value', 'config'],
    computed: {},
    methods: {
      vueSet (obj, path, val) {
        let value = obj
        let fields = _.isArray(path) ? path : _.toPath(path)
        for (let f in fields) {
          let idx = Number(f)
          let p = fields[idx]
          if (idx === fields.length - 1) Vue.set(value, p, val)
          else if (!value[p]) Vue.set(value, p, _.isNumber(p) ? [] : {})
          value = value[p]
        }
      }
    },
    data () {
      return {
        formData: {}
      }
    },
    created () {
      _.forEach(this.config.forms, (form) => {
        Object.defineProperty(this.formData, form.model, {
          get: () => _.get(this.value, form.model),
          set: (v) => this.vueSet(this.value, form.model, v)
        })
      })
    }
  }
</script>

μ‚¬μš©

<template lang="jade">
  div
    input-list(v-model="formData", :config='formConfig')
</template>

<script type="text/babel">
  import InputList from './InputList'
  export default {
    components: {
      InputList
    },
    data () {
      return {
        formData: {
          name: 'Jon',
          loc: {
            id: 1
          }
        },
        formConfig: {
          forms: [
            { type: 'input', model: 'loc.id' },
            { type: 'input', model: 'loc["name"]' }
          ]
        }
      }
    }
  }
</script>

이 방법을 μ‚¬μš©ν•˜λŠ” 경우 λ™μ μœΌλ‘œ μƒμ„±λœ 각 λ°˜μ‘ 데이터에 λŒ€ν•΄ κ°μ‹œμžλ₯Ό μ„€μ •ν•  수 μžˆλŠ” 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

@luqmanrom μ €λŠ” vue watcher의 λ‚΄λΆ€ μž‘λ™μ— μ΅μˆ™ν•˜μ§€ μ•Šμ§€λ§Œ vue.set으둜 μƒμ„±λœ λͺ¨λ“  것을 λ³Ό 수 μžˆμœΌλ―€λ‘œ 동적 μ†Œν’ˆμ„ κ΄€μ°°ν•˜κ³  λ³€κ²½ 사항에 λŒ€ν•΄ κ· μΌν•œ 값을 λ‚΄λ³΄λ‚΄λŠ” μ½”λ“œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ λŒ€μƒ 개체λ₯Ό κ°μ‹œν•  수 μžˆλ‹€κ³  λ―ΏμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ μ‚¬λžŒμ΄ 더 λ‚˜μ€ μ œμ•ˆμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이λ₯Ό μœ„ν•΄ νˆ΄ν‚·μ„ μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ v-model을 μ‚¬μš©ν•˜μ—¬ vuexλ₯Ό λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

https://github.com/bhoriuchi/vue-deepset

이것은 νŠΈλ¦­μ„ μˆ˜ν–‰ν•΄μ•Όν•©λ‹ˆλ‹€.

지령

Vue.directive('deep-model', {
    bind(el, binding, vnode) {
        el.addEventListener('input', e => {
            new Function('obj', 'v', `obj.${binding.value} = v`)(vnode.context.$data, e.target.value);
        });
    },
    unbind(el) {
        el.removeEventListener('input');
    },
    inserted(el, binding, vnode) {
        el.value = new Function('obj', `return obj.${binding.value}`)(vnode.context.$data);
    },
    update(el, binding, vnode) {
        el.value = new Function('obj', `return obj.${binding.value}`)(vnode.context.$data);
    }
});

μ‚¬μš©λ²•(κ΅¬μ„±μš”μ†Œ)

const component = Vue.extend({
    template: `<input v-deep-model="'one.two.three'">`,
    data() {
        return {
            one: { two: { three: 'foo' } }
        };
    }
});

μ—¬κΈ° μš”μ  μ°Έμ‘°κ°€ μžˆμŠ΅λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” μ—¬κΈ°μžˆλŠ” μ–΄λ–€ λͺΈ. Laravelκ³Ό ν•¨κ»˜ VUE.jsλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κ°€μ Έμ˜¨ 동적 μ‚¬μš©μž μ •μ˜ 양식 ν•„λ“œκ°€ μžˆμŠ΅λ‹ˆλ‹€. @yyx990803을 νŒ”λ‘œμš°ν–ˆμŠ΅λ‹ˆλ‹€ . v-λͺ¨λΈ="양식['이름']". ν•„λ“œκ°€ μž‘λ™ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ¬Έμ œλŠ” laravel μ»¨νŠΈλ‘€λŸ¬μ—μ„œ ν•„λ“œ 값을 κ°€μ Έμ˜¬ 수 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ—¬κΈ° μžˆλŠ” μ‚¬λžŒ @tylerOtwell Form.js 클래슀λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
λ‹Ήμ‹ μ˜ 도움은 크게 κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.
감사 ν•΄μš”

이것은 도움말 포럼이 μ•„λ‹™λ‹ˆλ‹€. https://forum.vuejs.org에 μ§ˆλ¬Έμ— λ‹΅ν•˜κΈ° μœ„ν•œ μ „μš© μ„œλΉ„μŠ€κ°€

v-model 값을 μ°ΎκΈ° μœ„ν•΄ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 데 정말 어렀움을 κ²ͺμ—ˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ° μ˜ˆκ°€ μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같은 λ‚ μ§œ λ²”μœ„ 선택기λ₯Ό λ§Œλ“€λ €κ³  ν•©λ‹ˆλ‹€.
image

μ—¬κΈ°μ„œ 사전 섀정은 λ‹€μŒκ³Ό 같은 λ°°μ—΄μ—μ„œ κ°€μ Έμ˜΅λ‹ˆλ‹€.

presets = [
  {
    label: 'Today',
    range: [moment().format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')]
  },
]

이제 data ꡬ성 μš”μ†Œμ— ν•΄λ‹Ή μž…λ ₯ ν•„λ“œμ— λŒ€ν•œ 두 개의 λ‚ μ§œκ°€ μžˆμŠ΅λ‹ˆλ‹€. startDate & endDate .

λ‚΄κ°€ μ •λ§λ‘œ ν•˜κ³  싢은 것은 μ‚¬μš©μžκ°€ μ„ νƒν•œ λ‚ μ§œμ™€ 사전 μ„€μ • κ΅¬μ„±μ—μ„œ μ „λ‹¬λœ λ‚ μ§œλ₯Ό λΉ„κ΅ν•˜κ³  v-model 값을 true λ˜λŠ” false μ™œλƒν•˜λ©΄...

  • v-model λŠ” 쑰건을 μˆ˜λ½ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ preset.range[0] === startDate && preset.range[1] === endDate ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • v-model λŠ” v-for 별칭이 ν•¨μˆ˜μ— μ „λ‹¬λ˜λŠ” 것을 ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‚˜λŠ” λ‹€μŒκ³Ό 같은 것을 ν•  수 μ—†λ‹€.
<li v-model="isActive(index)" v-for="(preset, index) in presets">
...
</li>

μ΅œμ†Œν•œ 쑰건문을 ν—ˆμš©ν•˜λ©΄ 이 문제λ₯Ό μ‰½κ²Œ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ 근본적으둜 잘λͺ»λœ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμœΌλ―€λ‘œ λ‹€λ₯Έ λ°©λ²•μœΌλ‘œ 달성할 수 μžˆλŠ”μ§€ 지적해 μ£Όμ‹­μ‹œμ˜€.

ν˜„μž¬ μ €λŠ” κ³„μ‚°λœ 속성이 ν•¨μˆ˜ ν˜ΈμΆœμ΄λΌλŠ” 사싀을 μ΄μš©ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

슀크립트

computed: {
  isActive() {
      return this.presets.map(
        preset =>
          preset.range[0] === this.startDate && preset.range[1] === this.endDate
      );
    }
}

μ£Όν˜•

<li v-model="isActive[index]" v-for="(preset, index) in presets">
...
</li>

κ·ΈλŸ¬λ‚˜ 그것은 μ •λ§λ‘œ λ‚˜μ—κ²Œ ν•΄ν‚Ήμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. ν™•μ‹€ν•˜μ§€ μ•Šλ‹€. μ œμ•ˆν•˜μ‹­μ‹œμ˜€.

여기에 μ„€λͺ…λœ λŒ€λ‘œ 이것이 Vuex와 ν•¨κ»˜ μž‘λ™ν•˜λŠ”μ§€ μ•„λŠ” μ‚¬λžŒμ΄ μžˆμŠ΅λ‹ˆκΉŒ? https://vuex.vuejs.org/guide/forms.html

μ•½κ°„ 동적인 μž…λ ₯ ν•„λ“œλ₯Ό κ°–κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

<input v-model="dataHandler" :scope="foo" type="checkbox" />

λ‹€μŒ μ½”λ“œ λ‚΄μ—μ„œ dom μš”μ†Œμ˜ "λ²”μœ„"에 μ–΄λ–»κ²Œ μ•‘μ„ΈμŠ€ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

computed: {
  message: {
    get () {
      //
    },
    set (value) {
      //
    }
  }
}

@vielhuberκ°€ ref λ₯Ό μ‚¬μš©ν•˜λ €κ³  ν•©λ‹ˆκΉŒ?

<input ref="myInput" v-model="dataHandler" :scope="foo" type="checkbox" />
this.$refs.myInput.getAttribute('scope') // => 'foo'

μ•ˆλ…•ν•˜μ„Έμš”, 이 μ£Όμ œμ™€ κ΄€λ ¨λœ Vue 질문이 μžˆμŠ΅λ‹ˆλ‹€ - "동적 v-model μ§€μ‹œλ¬Έ":

Vue ꡬ성 μš”μ†Œλ₯Ό κ΅¬ν˜„ν•  λ•Œ v-model modifier - .lazy 등을 μ–΄λ–»κ²Œ λ™μ μœΌλ‘œ μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?
예λ₯Ό λ“€μ–΄:

<el-input v-model[field.lazy ? '.lazy' : '']="model[field.key]">

이것은 λ‚˜λ₯Ό μœ„ν•΄ μž‘λ™ν•©λ‹ˆλ‹€.

<input v-model="$data[field].key" type="text">

@fritx μˆ˜μ •μžλ₯Ό "λ™μ μœΌλ‘œ" λ³€κ²½ν•˜κΈ° μœ„ν•΄ λ‹€μŒκ³Ό 같이 v-if λ””λ ‰ν„°λ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

<input v-if="field.lazy" v-model.lazy="model[field.key]">
<input v-else v-model="model[field.key]">

μˆ˜μ •μžμ˜ λ‹€μ–‘ν•œ 쑰합을 μ›ν•˜λŠ” 경우 번거둜울 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•œ 가지 μ˜΅μ…˜μ€ λͺ¨λ“  if 문을 ν¬ν•¨ν•˜λŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ ꡬ성 μš”μ†Œλ₯Ό λ§Œλ“€κ³  λ Œλ”λ§ν•˜λ €λŠ” μž…λ ₯ ꡬ성 μš”μ†Œμ™€ μ›ν•˜λŠ” μˆ˜μ •μžκ°€ μžˆλŠ” μž…λ ₯을 κ²°μ •ν•˜λŠ” μˆ˜μ •μž 배열을 μ „λ‹¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μœ„μ™€ 같은 if 문을 μ‚¬μš©ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œλ„ μΆ©λΆ„ν–ˆμŠ΅λ‹ˆλ‹€.

v-model μ§€μ‹œλ¬Έμ—μ„œ κ³„μ‚°λœ 속성에 λ™μ μœΌλ‘œ μ•‘μ„ΈμŠ€ν•˜λŠ” 방법을 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.
λ‹€μŒμ„ μ‚¬μš©ν•˜μ—¬ 데이터 속성에 μ•‘μ„ΈμŠ€ν•  수 μžˆμœΌλ―€λ‘œ λ‚΄ κ³„μ‚°λœ 속성에 μ•‘μ„ΈμŠ€ν•  수 μžˆλŠ” 방법이 μ—†μŠ΅λ‹ˆλ‹€.
v-model="$data[무언가]"

λ‚΄ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

computed: { get () { // }, set (value) { // } } }

찾을 수 μ—†λŠ” λ¬Έμžμ—΄λ‘œ κ³„μ‚°λœ 속성에 μ•‘μ„ΈμŠ€ν•˜λŠ” 방법이 ν•„μš”ν•©λ‹ˆλ‹€.
이것은 μ˜ˆμ΄μ§€λ§Œ λ‹€λ₯Έ μ†”λ£¨μ…˜λ„ μž‘λ™ν•©λ‹ˆλ‹€.
<input v-model="$computed[someDynamicString]">
μ•„λ‹ˆλ©΄ κ·Έλƒ₯
<input v-model="[someDynamicString]">

λ‚΄κ°€ 찾은 κ°€μž₯ κ°€κΉŒμš΄ 것은 "_computedWatchers[someDynamicString].value"μ΄μ§€λ§Œ setter 및 getterμ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ κ³„μ‚°λœ 값이면 μž‘λ™ν•  κ²ƒμž…λ‹ˆλ‹€.

v-model="dialogTemp.tmBasFuelEntities[dialogTemp.tmBasFuelEntities.findIndex(t=>t.paramCode==item.paramCode)].paramValue"

이것은 λ‚΄ dialogTempμž…λ‹ˆλ‹€.

dialogTemp: {
  tmBasFuelEntities: [
    {
      paramCode: '',
      paramValue: ''
    },
    {
      paramCode: '',
      paramValue: ''
    },
    {
      paramCode: '',
      paramValue: ''
    },
  ]
}

@fritx μˆ˜μ •μžλ₯Ό "λ™μ μœΌλ‘œ" λ³€κ²½ν•˜κΈ° μœ„ν•΄ λ‹€μŒκ³Ό 같이 v-if λ””λ ‰ν„°λ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

<input v-if="field.lazy" v-model.lazy="model[field.key]">
<input v-else v-model="model[field.key]">

μˆ˜μ •μžμ˜ λ‹€μ–‘ν•œ 쑰합을 μ›ν•˜λŠ” 경우 번거둜울 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•œ 가지 μ˜΅μ…˜μ€ λͺ¨λ“  if 문을 ν¬ν•¨ν•˜λŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ ꡬ성 μš”μ†Œλ₯Ό λ§Œλ“€κ³  λ Œλ”λ§ν•˜λ €λŠ” μž…λ ₯ ꡬ성 μš”μ†Œμ™€ μ›ν•˜λŠ” μˆ˜μ •μžκ°€ μžˆλŠ” μž…λ ₯을 κ²°μ •ν•˜λŠ” μˆ˜μ •μž 배열을 μ „λ‹¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μœ„μ™€ 같은 if 문을 μ‚¬μš©ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œλ„ μΆ©λΆ„ν–ˆμŠ΅λ‹ˆλ‹€.

멋지긴 ν•˜μ§€λ§Œ λ„ˆλ¬΄ μž₯ν™©ν•œ λ°”λ‘œ κ·Έ ν•˜λ‚˜μ— λ§Žμ€ μ†Œν’ˆμ„ 전달해야 ν–ˆμŠ΅λ‹ˆλ‹€. @danhanson

<template v-else-if="itemCom">
        <component v-if="getFieldType(field) === 'number'"
          :is="itemCom"
          :model="model"
          :field="field"
          :schema="schema"
          v-model.number="model[field.key]"
          v-loading="field.loading"
          v-bind="getFieldAttrs(field)"
          v-on="field.listen"
          @form-emit="handleFormEmit"
        ></component>
        <component v-else
          :is="itemCom"
          :model="model"
          :field="field"
          :schema="schema"
          v-model="model[field.key]"
          v-loading="field.loading"
          v-bind="getFieldAttrs(field)"
          v-on="field.listen"
          @form-emit="handleFormEmit"
        ></component>

@fritx v-model λ₯Ό :value / @input ν•˜κ³  μˆ˜λ™μœΌλ‘œ ꡬ문 뢄석할 수 μžˆμŠ΅λ‹ˆλ‹€.

</template>
        <component v-if="getFieldType(field) === 'number'"
          :is="itemCom"
          :model="model"
          :field="field"
          :schema="schema"
          :value="parseField(field, model[field.key])"
          @input="model[field.key] = parseField(field, $event.target.value)"
          v-loading="field.loading"
          v-bind="getFieldAttrs(field)"
          v-on="field.listen"
          @form-emit="handleFormEmit"
        ></component>
<template>
<script>

export default {
    ...
    methods: {
        parseField (field, val) {
            if (this.getFieldType(field) === 'number') {
                return Number(val);
            }
            return val;
        }
    }
};
</script>

@danhanson λ©‹μ Έμš”

@danhanson μ£„μ†‘ν•©λ‹ˆλ‹€.

:value="getFieldValue(field, model[field.key])"
@input="model[field.key] = getFieldValue(field, $event)"
@change="model[field.key] = getFieldValue(field, $event)"

잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. μ‹œλ„ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. 감사 ν•΄μš”!

@ninojovic

μ—¬κΈ°μ—μ„œ 해결책을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. https://forum.vuejs.org/t/accessing-computed-properties-from-template-dynamically/4798/9

<input v-model="_self[someDynamicString]">
λ‚˜λ₯Ό μœ„ν•΄ μž‘λ™

이 같은

<el-input
  v-if="!nestedField.widget"
  v-model="form[nestedField.id]"
  placeholder=""
  v-bind="nestedField.rest"
>
[
  {
    label: 'ζ”ΆζˆΏδ»·ζ Ό',
    id: 'housePrice',
    type: Number,
    widget: 'div',
    fieldSet: [
      {
        label: '',
        id: 'housePrice',
        type: Number,
        defaultValue: 0,
        rest: {
          style: 'width:5em;'
        },
      },
      {
        label: '',
        id: 'priceUnit',
        type: String,
        widget: 'select',
        defaultValue: 'ε…ƒ/月',
        options: [
          { label: 'ε…ƒ/月', value: 'ε…ƒ/月' },
          { label: 'ε…ƒ/εΉ΄', value: 'ε…ƒ/εΉ΄' },
          { label: ' ε…ƒ/倩·m2', value: 'ε…ƒ/倩·m2' },
        ],
        rest: {
          style: 'width:6em;'
        },
      },
    ],
  },
]

ν•„λ“œ μœ ν˜•μ΄ Number 이면 훨씬 더 νŽΈλ¦¬ν•œ v-model.number λ₯Ό μ‚¬μš©ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. @fritx

λ‚˜λŠ” 그것에 맞게 v-model을 λΆ„ν•΄ν•©λ‹ˆλ‹€.

<el-input
  v-if="!nestedField.widget"
  :value="form[nestedField.id]"
  @input="v => { form[nestedField.id] = isNumber(nestedField.type) ? Number(v) : v }"
  placeholder=""
  v-bind="nestedField.rest"
>
  <template v-if="nestedField.suffixText" slot="append">{{nestedField.suffixText}}</template>
</el-input>

jqueryλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚½μž…ν•˜λŠ” (양식 μž…λ ₯의 일뢀)λ₯Ό μ‚¬μš©ν•˜μ—¬ HMTL을 λ³΅μ œν–ˆμŠ΅λ‹ˆλ‹€. (λ‚΄κ°€ μ™œ jqueryλ₯Ό μ‚¬μš©ν•˜λŠ”μ§€ λ§ν•˜μ§€ λ§ˆμ‹­μ‹œμ˜€). 이제 λ‚΄ μš”μ†Œκ°€ jquery에 μ˜ν•΄ μ‚½μž…λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ v-model을 바인딩할 수 μžˆμŠ΅λ‹ˆλ‹€.

$('.area').append('formPart')
in form i have some inputs like
<div class="form-group">
<input type="text" name="area2" /> 
<input type="text" name="area3" />
</div>

κ·Έλž˜μ„œ μ˜μ—­ 2와 3μ—μ„œ v-model을 μ–΄λ–»κ²Œ 바인딩할 수 μžˆμŠ΅λ‹ˆκΉŒ?

@ninojovic

μ—¬κΈ°μ—μ„œ 해결책을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. https://forum.vuejs.org/t/accessing-computed-properties-from-template-dynamically/4798/9

<input v-model="_self[someDynamicString]">
λ‚˜λ₯Ό μœ„ν•΄ μž‘λ™

μ €μ—κ²Œλ„ νš¨κ³Όκ°€ μžˆμ§€λ§Œ "_self" λ³€μˆ˜λŠ” Vue의 λ‚΄λΆ€ 속성을 μœ„ν•΄ μ˜ˆμ•½λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€(#2098 μ°Έμ‘°).

즉, 이 κ΅¬ν˜„μ€ λ―Έλž˜μ— 쀑단될 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 이 방법을 μ„ ν˜Έν•œλ‹€:

<template>
  <input v-model="mySelf[someDynamicString]">
</template>

<script>
export default {
  data() {
    return {
      mySelf: this
    }
  }
}
</script>

μžμ„Έν•œ λ‚΄μš©μ€ https://stackoverflow.com/questions/52104176/use-of-self-attribute-from-vue-vm-is-reliable을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰