So deaktivieren Sie die Eingabe in vue.js bedingt

276

Ich habe eine Eingabe:

<input type="text" id="name" class="form-control" name="name"  v-model="form.name" :disabled="validated ? '' : disabled">

und in meiner Vue.js-Komponente habe ich:

..
..
ready() {
        this.form.name = this.store.name;
        this.form.validated = this.store.validated;
    },
..

validatedAls a booleankann es entweder 0oder sein 1, aber egal welcher Wert in der Datenbank gespeichert ist, meine Eingabe ist immer deaktiviert.

Ich muss den Eingang deaktivieren, wenn falseer aktiviert und bearbeitet werden kann.

Aktualisieren:

Dadurch immer ermöglicht die Eingabe (keine Rolle , ich habe 0 oder 1 in der Datenbank):

<input type="text" id="name" class="form-control" name="name"  v-model="form.name" :disabled="validated ? '' : disabled">

Dadurch wurde die Eingabe immer deaktiviert (egal, ob ich 0 oder 1 in der Datenbank habe):

<input type="text" id="name" class="form-control" name="name"  v-model="form.name" :disabled="validated ? disabled : ''">
Zaffar Saffee
quelle

Antworten:

483

Um die deaktivierte Requisite zu entfernen, sollten Sie ihren Wert auf setzen false. Dies muss der boolesche Wert für sein false, nicht die Zeichenfolge 'false'.

Wenn der Wert für validatedentweder eine 1 oder eine 0 ist, setzen Sie die disabledRequisite basierend auf diesem Wert bedingt . Z.B:

<input type="text" :disabled="validated == 1">

Hier ist ein Beispiel.

var app = new Vue({
  el: '#app',

  data: {
    disabled: 0,
  },
}); 
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <button @click="disabled = (disabled + 1) % 2">Toggle Enable</button>
  <input type="text" :disabled="disabled == 1">
    
  <pre>{{ $data }}</pre>
</div>

asemahle
quelle
In meiner Datenbank habe ich 0 und 1 für wahr und falsch gespeichert und spiele mit deiner Geige. 0 und 1 halten sie deaktiviert
Zaffar Saffee
Muss ich meine Datenbankstruktur bearbeiten, damit sie genau wahr und falsch ist?
Zaffar Saffee
Nein, setzen Sie einfach den Wert entweder trueoder falseabhängig vom Wert des Elements in Ihrer
Datenbank
11
einfach tun :: disabled = "validiert" Solange validiert True / false oder 0/1 ist, weiß Javascript Bescheid.
Despertaweb
1
@gk der Code, der in der jsfiddle war, ist jetzt in der Antwort
asemahle
63

Sie könnten eine berechnete Eigenschaft haben, die einen Booleschen Wert zurückgibt, abhängig von den Kriterien, die Sie benötigen.

<input type="text" :disabled=isDisabled>

Dann legen Sie Ihre Logik in eine berechnete Eigenschaft ...

computed: {
  isDisabled() {
    // evaluate whatever you need to determine disabled here...
    return this.form.validated;
  }
}
David Morrow
quelle
Dies funktionierte für mich, keine Anführungszeichen erforderlich, in meinem Fall Aufruf isDisabled()innerhalb des HTML-Codes, definiert in Data.
Leo
Ich mag das definitiv viel ordentlicher
Shady Echo 419
Warum werden keine Angebote benötigt?
Ferkze
23

Nicht schwer, überprüfen Sie dies.

<button @click="disabled = !disabled">Toggle Enable</button>
<input type="text" id="name" class="form-control" name="name"  v-model="form.name" :disabled="disabled">

jsfiddle

Sebastiao Marcos
quelle
Ihre Komponente benötigt Datenattrs mit deaktiviertem: false- oder booleschen Typ.
Sebastiao Marcos
15

Ihr deaktiviertes Attribut erfordert einen booleschen Wert:

<input :disabled="validated" />

Beachten Sie, wie ich nur überprüft habe, ob validated- Dies sollte funktionieren als 0 is falsey... z

0 is considered to be false in JS (like undefined or null)

1 is in fact considered to be true

Um besonders vorsichtig zu sein, versuchen Sie: <input :disabled="!!validated" />

Diese doppelte Negation dreht den falseyoder truthy-Wert von 0oder 1zu falseodertrue

Glaubst du mir nicht? Gehe in deine Konsole und tippe !!0oder !!1:-)

Um sicherzustellen, dass Ihre Nummer 1oder 0definitiv als Nummer und nicht als Zeichenfolge durchkommt, '1'oder um '0'den Wert, den Sie mit einem +z. B. überprüfen, vorauszusetzen, wird aus <input :disabled="!!+validated"/>einem String einer Zahl eine Zahl, z

+1 = 1 +'1' = 1 Wie David Morrow oben sagte, könnten Sie Ihre bedingte Logik in eine Methode einfügen - dies gibt Ihnen besser lesbaren Code - und einfach die Bedingung, die Sie überprüfen möchten, aus der Methode zurückgeben.

Francis Leigh
quelle
11

Sie können das :disabledAttribut in vue.js bearbeiten .

Es akzeptiert einen Booleschen Wert. Wenn dies der Fall ist , wird die Eingabe deaktiviert, andernfalls wird sie aktiviert ...

So etwas wie strukturiert wie unten in Ihrem Fall zum Beispiel:

<input type="text" id="name" class="form-control" name="name" v-model="form.name" :disabled="validated ? false : true">

Lesen Sie dies auch unten:

Eingabeelemente über JavaScript-Ausdruck bedingt deaktivieren

Sie können Eingabeelemente inline mit einem JavaScript-Ausdruck bedingt deaktivieren. Dieser kompakte Ansatz bietet eine schnelle Möglichkeit, einfache bedingte Logik anzuwenden. Wenn Sie beispielsweise nur die Länge des Kennworts überprüfen müssen, können Sie Folgendes in Betracht ziehen.

<h3>Change Your Password</h3>
<div class="form-group">
  <label for="newPassword">Please choose a new password</label>
  <input type="password" class="form-control" id="newPassword" placeholder="Password" v-model="newPassword">
</div>

<div class="form-group">
  <label for="confirmPassword">Please confirm your new password</label>
  <input type="password" class="form-control" id="confirmPassword" placeholder="Password" v-model="confirmPassword" v-bind:disabled="newPassword.length === 0 ? true : false">
</div>
Alireza
quelle
7

Sie können eine berechnete Eigenschaft erstellen und jeden Formulartyp entsprechend seinem Wert aktivieren / deaktivieren.

<template>
    <button class="btn btn-default" :disabled="clickable">Click me</button>
</template>
<script>
     export default{
          computed: {
              clickable() {
                  // if something
                  return true;
              }
          }
     }
</script>
Yamen Ashraf
quelle
1
Dies ist meiner Meinung nach die am einfachsten zu lesende und auf den eigenen Anwendungsfall anzuwendende Antwort.
Giorgio Tempesta
1
Dies war das einzige, was für mich funktioniert hat. um die Methode auf berechnete statt auf Methoden zu verschieben. Vielen Dank!
Jokab
6

Versuche dies

 <div id="app">
  <p>
    <label for='terms'>
      <input id='terms' type='checkbox' v-model='terms' /> Click me to enable
    </label>
  </p>
  <input :disabled='isDisabled'></input>
</div>

vue js

new Vue({
  el: '#app',
  data: {
    terms: false
  },
  computed: {
    isDisabled: function(){
        return !this.terms;
    }
  }
})
Atchutha Rama Reddy Karri
quelle
4

Das Deaktivieren des deaktivierten Attributs der Eingabe war überraschend komplex. Für mich gab es zwei Probleme:

(1) Denken Sie daran: Das Attribut "deaktiviert" der Eingabe ist KEIN Boolesches Attribut.
Das bloße Vorhandensein des Attributs bedeutet, dass die Eingabe deaktiviert ist.

Die Ersteller von Vue.js haben dies jedoch vorbereitet ... https://vuejs.org/v2/guide/syntax.html#Attributes

(Danke an @connexo dafür ... Wie füge ich ein deaktiviertes Attribut in den Eingabetext in vuejs ein? )

(2) Außerdem gab es ein Problem mit dem erneuten Rendern des DOM-Timings, das ich hatte. Das DOM wurde nicht aktualisiert, als ich versuchte, zurückzuschalten.

In bestimmten Situationen wird "die Komponente nicht sofort neu gerendert. Sie wird im nächsten 'Tick' aktualisiert."

Aus den Vue.js-Dokumenten: https://vuejs.org/v2/guide/reactivity.html

Die Lösung war zu verwenden:

this.$nextTick(()=>{
    this.disableInputBool = true
})

Vollständigerer Beispielworkflow:

<div @click="allowInputOverwrite">
    <input
        type="text"
        :disabled="disableInputBool">
</div>

<button @click="disallowInputOverwrite">
    press me (do stuff in method, then disable input bool again)
</button>

<script>

export default {
  data() {
    return {
      disableInputBool: true
    }
  },
  methods: {
    allowInputOverwrite(){
      this.disableInputBool = false
    },
    disallowInputOverwrite(){
      // accomplish other stuff here.
      this.$nextTick(()=>{
        this.disableInputBool = true
      })
    }
  }

}
</script>
Kobi
quelle
++ (Die Schöpfer von Vue.js haben dies jedoch vorbereitet ... vuejs.org/v2/guide/syntax.html#Attributes )
Rytis Dereskevicius
2

Kann diese Add-Bedingung verwenden.

  <el-form-item :label="Amount ($)" style="width:100%"  >
            <template slot-scope="scoped">
            <el-input-number v-model="listQuery.refAmount" :disabled="(rowData.status !== 1 ) === true" ></el-input-number>
            </template>
          </el-form-item>
Anson
quelle
0

Denken Sie daran, dass ES6-Sets / Karten zum Zeitpunkt des Schreibens nicht reaktiv zu sein scheinen, soweit ich das beurteilen kann.

omarjebari
quelle