Vue: Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° динамичСской v-ΠΌΠΎΠ΄Π΅Π»ΠΈ

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 16 июл. 2015  Β·  42ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: vuejs/vue

Π’ настоящСС врСмя Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° v-model Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ привязки Ρ‚ΠΈΠΏΠ° усов для Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ привязки, Π½ΠΎ эта функция Π±Ρ‹Π»Π° Π±Ρ‹ Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Π° для создания Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŽ Ρ„ΠΎΡ€ΠΌ.

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π²Ρ‹ ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ v-model="form[field.name]" .

ВсС 42 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ привСсти ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, для Ρ‡Π΅Π³ΠΎ это Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ?

Π‘ΠΊΠ°ΠΆΠ΅ΠΌ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ создаСм ΠΊΠ»ΠΎΠ½ phpmyadmin, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° DESCRIBE TABLE ΠΈ строит Ρ„ΠΎΡ€ΠΌΡƒ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° строк ΠΈΠ· этих Π΄Π°Π½Π½Ρ‹Ρ…. ВыраТСния привязки Π² этом случаС Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎ своСй сути динамичСскими, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΠ»Π΅ΠΉ ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС выполнСния 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]" .

ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ? Π£Ρ… Ρ‚Ρ‹ !

Π­Π²Π°Π½, моТСшь Π»ΠΈ Ρ‚Ρ‹ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ скрипт js, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π°Π΄Π°Ρ‡ΠΈ?

@ yyx990803 , это Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ, Π½ΠΎ это Π±Ρ‹Π» всСго лишь ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ динамичСского использования. Π’ бизнСс-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π»ΠΎΠ³ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТной.

Π§Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ ясным, я ΠΏΡ€ΠΎΡ‚ΠΈΠ² Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΠΎΠ»ΡΡ†ΠΈΡŽ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ². ΠŸΡ€ΡΠΌΠΎ сСйчас усы ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ строкой ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ строка (для вставки Π² DOM ΠΈΠ»ΠΈ для поиска ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°). ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ усов Π² выраТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ†Π΅Π½Π΅Π½Ρ‹, Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ двумя уровнями абстракции ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ваши ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ Π·Π°ΠΏΡƒΡ‚Π°Π½Π½Ρ‹ΠΌΠΈ.

я Π΄ΡƒΠΌΠ°ΡŽ, Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строку ΠΏΠ΅Ρ€Π΅Π΄ вычислСниСм выраТСния

ΠΌΠ΅Ρ‚ΠΎΠ΄ 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'>

ΠΈΠ»ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, функция получСния / установки, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ.

ΠΎΡ‚ΠΊΠ°Π· ΠΎΡ‚ отвСтствСнности: я Π½Π΅ Ρ‡ΠΈΡ‚Π°Π» ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ 2.0, поэтому Π²Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ»ΠΈΡΡŒ ΠΊ этому Ρ‚Π°ΠΌ.

@bhoriuchi, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅Ρ‚ вычисляСмого свойства?

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

А для v-model Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вычисляСмоС свойство с сСттСром.

@simplesmiler Π― Π½Π΅ ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π» Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ свойства Π² двустороннСй привязкС, я

ΠžΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ

@simplesmiler - поэтому ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ я ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡΡŒ с использованиСм вычисляСмого свойства, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ мСня Π½Π΅Ρ‚ способа ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ вычисляСмому свойству. this Π²Π½ΡƒΡ‚Ρ€ΠΈ Π³Π΅Ρ‚Ρ‚Π΅Ρ€Π° ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ value Π² get(value) ΠΎΠ±Π° ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚.

Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ прСдыстории ΠΌΠΎΠ΅Π³ΠΎ использования.

Π― создаю конструктор Ρ„ΠΎΡ€ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ json для создания Ρ„ΠΎΡ€ΠΌ. ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ прСдставляСт собой Π±ΠΎΠ»Π΅Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΅ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (строк / Ρ„ΠΎΡ€ΠΌ). ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΠ»Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΅ΡΡ‚ΡŒ строка ΠΏΡƒΡ‚ΠΈ ΠΊ полю, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ установлСно. Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вычисляСмоС свойство для этого, ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ привязку ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, ΠΊΠ°ΠΊΠΎΠΉ индСкс строки / Ρ„ΠΎΡ€ΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

Π² настоящСС врСмя Ρƒ мСня это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с использованиСм ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π΄Π²ΡƒΡ…ΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива с ΠΈΠΌΠ΅Π½Π΅ΠΌ formData ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ я ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°ΡŽ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ модСль Ρ„ΠΎΡ€ΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ v-model="formData[rowIndex][formIndex]" ΠΈ я наблюдаю Π·Π° этим ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈ обновляю Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄Π°Π½Π½Ρ‹Ρ…, Π½ΠΎ я ΠΌΠ½Π΅ Π½Π΅ нравится этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ мСня ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ массива для динамичСского добавлСния поля.

ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ 2 уровня влоТСнности, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ этот ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ построитСля Ρ„ΠΎΡ€ΠΌ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ

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

Π³Π΄Π΅ моя строка ΠΏΡƒΡ‚ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ

templates.operatingSystems[<dynamic uuid>]

ОбновлСниС 2

я ΠΏΠ΅Ρ€Π΅ΡˆΠ΅Π» с использования ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива Π½Π° простой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ

"<rowIndex>_<formIndex>"

ΠΈ использовал Π³Π»ΡƒΠ±ΠΎΠΊΠΈΠ΅ часы, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ с Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ. Π― ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ мСТпланСтная привязка Π±Ρ‹Π»Π° Π±Ρ‹ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ.

+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') Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅

Π― пСрСсмотрСл это ΠΈ нашСл Π±ΠΎΠ»Π΅Π΅ простоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ собствСнный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ Π³Π΅Ρ‚Ρ‚Π΅Ρ€Ρ‹ / сСттСры ΠΏΡ€ΠΈ создании с использованиСм строки ΠΏΡƒΡ‚ΠΈ ΠΊ ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π’ΠΎΡ‚ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€

список ввода

<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, Π½ΠΎ я ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ всС, Ρ‡Ρ‚ΠΎ создано с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ vue.set, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ, поэтому Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ для просмотра динамичСских свойств ΠΈ гСнСрирования событий ΠΏΡ€ΠΈ измСнСниях, ΠΈΠ»ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ. Π£ ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅

Π― написал для этого инструмСнтарий. Ρ‚Π°ΠΊΠΆΠ΅ позволяСт ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ vuex с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ v-ΠΌΠΎΠ΄Π΅Π»ΠΈ

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' } }
        };
    }
});

Π’ΠΎΡ‚ ссылка Π½Π°

ΠŸΡ€ΠΈΠ²Π΅Ρ‚ всСм здСсь. Π― ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ VUE.js с Laravel. Π£ мСня Π΅ΡΡ‚ΡŒ поля динамичСской настраиваСмой Ρ„ΠΎΡ€ΠΌΡ‹, ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠ΅ ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Π― подписался Π½Π° @ yyx990803 . v-model = "Ρ„ΠΎΡ€ΠΌΠ° ['имя']". ΠŸΠΎΠ»Π΅Π²Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Но ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ я Π½Π΅ ΠΌΠΎΠ³Ρƒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ значСния ΠΏΠΎΠ»Π΅ΠΉ Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅ 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-ΠΌΠΎΠ΄Π΅Π»ΠΈΒ»:

Когда я Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Vue, ΠΊΠ°ΠΊ я ΠΌΠΎΠ³Ρƒ динамичСски ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ v-ΠΌΠΎΠ΄Π΅Π»ΠΈ - .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", Π½ΠΎ это Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с сСттСрами ΠΈ Π³Π΅Ρ‚Ρ‚Π΅Ρ€Π°ΠΌΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, это сработало Π±Ρ‹, Ссли Π±Ρ‹ это Π±Ρ‹Π»ΠΎ просто вычислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

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-модСль, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° подошла ΠΊ Π½Π΅ΠΉ.

<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>

Π£ мСня Π΅ΡΡ‚ΡŒ ΠΊΠ»ΠΎΠ½ HMTL, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ (Ρ‡Π°ΡΡ‚ΡŒ для Π²Π²ΠΎΠ΄Π° Ρ„ΠΎΡ€ΠΌΡ‹), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я Π²ΡΡ‚Π°Π²Π»ΡΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ jquery. (Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅, ΠΏΠΎΡ‡Π΅ΠΌΡƒ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ jquery). Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΉ элСмСнт вставляСтся jquery. Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ v-модСль.

$('.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>

Π˜Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ я ΠΌΠΎΠ³Ρƒ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ v-модСль ΠΊ области 2 ΠΈ 3.

@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 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ