Wie kann ich behalten Sie die Reihenfolge der Begünstigten generiert mit jquery?

Ich entwickle einen Wird die Generierung von web-Anwendung. Dafür muss ich ein system entwickeln, das dem Benutzer zu ermöglichen, fügen Sie mehrere Empfänger. Ich habe geschrieben einige code, der für die Schöpfung auf der neuen Begünstigten, aber das Problem ist, wenn ein Benutzer löscht eine begünstigte die Sequenz-Nummer nicht entsprechend arbeiten.

Zum Beispiel, Benutzer Hinzugefügt 5 Leistungsempfänger und er löscht die 3. begünstigte die Sequenz-Nummer nicht ändern. d.h. begünstigte 1, Empfänger 2, Begünstigten 4, Begünstigten 5. Ich will zu Sortieren dieses problem, stellen Sie Sie in der Reihenfolge.

Für meine code-bitte überprüfen Sie diese

https://jsfiddle.net/shahzadwaris/purvo4bn/5/

$(document).delegate(".delBeneficiary", "click", function(e) {
  e.preventDefault();
  var div = $(this).attr("id");
  var nmbr = div.replace(/\D/g, "");
  $("." + div).remove();
  bene--;

  //alert(nmbr);
});
var bene = 2;
$(".addBeneficiary").click(function(e) {
  e.preventDefault();
  addBeneficiary(bene);
  bene++;
});
$(document).delegate(".addBeneficiaryD", "click", function(e) {
  e.preventDefault();
  addBeneficiary(bene);
  bene++;
});

function addBeneficiary(bene) {
  $("#beneficiaries").append(
    "<div class = 'bene" +
    bene +
    "'><h6 class = 'mt-3 mb-3'><b>Beneficiary <span class = 'bNmbr'>" +
    bene +
    "</span></b></h6>" +
    "<div class='form-group row'>" +
    "<label for='ename' class='col-sm-4 col-form-label backgroundForm pt-2 pb-2'><span class = 'pt-5'>Name</span><span class = 'text-danger'> *</span></label>" +
    "<div class='col-sm-7'>" +
    " <input type='text' class='form-control p-1 mt-1' id='ename' name = 'ebname[]' placeholder='Name'>" +
    "</div>" +
    "<label for='enric' class='col-sm-4 col-form-label backgroundForm pt-2 pb-2'><span class = 'pt-5'>NRIC / Passport No.</span><span class = 'text-danger'> *</span></label>" +
    "<div class='col-sm-7'>" +
    "<input type='text' class='form-control p-1 mt-1' id='enric' name = 'ebnric[]' placeholder='NRIC / Passport No'>" +
    "</div> " +
    "<label for='relationship' class='col-sm-4 col-form-label backgroundForm pt-2 pb-2'><span class = 'pt-5'>Relationship</span></label>" +
    "<div class='col-sm-7'>" +
    "<input type='text' class='form-control p-1 mt-1' id='Rrelationship' name = 'ebrelationship[]' placeholder='Relationship'>" +
    "</div>" +
    "<div class = 'col-xs-12 col-sm-12 col-md-11 mt-2  text-right'>" +
    "<button class = 'btn btn-sm addBeneficiaryD ' id = 'bene" +
    bene +
    "' >Add</button>" +
    "<button class = 'btn btn-sm delBeneficiary ml-2' id = 'bene" +
    bene +
    "'>Delete</button>" +
    "</div>" +
    "</div></div>"
  );
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h6 class='mt-3 mb-3'><b>Beneficiary <span class = 'bNmbr'>1</span></b></h6>
<div class="form-group row">

  <label for="ename" class="col-sm-4 col-form-label backgroundForm pt-2 pb-2"><span class = 'pt-5'>Name</span><span class = 'text-danger'> *</span></label>
  <div class="col-sm-7">
    <input type="text" class="form-control p-1 mt-1" id="ename" name='ebname[]' placeholder="Name" required='required' />
  </div>
  <label for="enric" class="col-sm-4 col-form-label backgroundForm pt-2 pb-2"><span class = 'pt-5'>NRIC / Passport No.</span><span class = 'text-danger'> *</span></label>
  <div class="col-sm-7">
    <input type="text" class="form-control p-1 mt-1" id="enric" name='ebnric[]' placeholder="NRIC / Passport No" required='required' />
  </div>
  <label for="relationship" class="col-sm-4 col-form-label backgroundForm pt-2 pb-2"><span class = 'pt-5'>Relationship</span></label>
  <div class="col-sm-7">
    <input type="text" class="form-control p-1 mt-1" id="Rrelationship" name='ebrelationship[]' placeholder="Relationship" required='required' />
  </div>
  <div class='col-xs-12 col-sm-10 col-md-8 mt-2  text-right'>
    <button class='btn btn-sm addBeneficiary '>Add</button>
  </div>
</div>
<div id='beneficiaries'>
</div>

+1
2019-09-17 09:57:20
Quelle
4 Antworten

Android unterstützt bereits system automatische backups wenn Sie haben android:allowBackup="true" in Ihrem manifest. Wenn es nicht genug und Sie wollen, um backups zu verwalten manuell zwischen app installiert haben, als Sie auf Datenbank kopieren von context.getDatabasePath("<your-database-name>") auf externen Speicher irgendwo, und dann kopieren Sie Sie zurück, wenn Sie wollen

+0
2019-09-17 10:13:31

In Ihrer Tätigkeit stellen Sie backup-und restore-button und definieren die lokale Datenbank variable wie,

private MainDatabase localBackup = new MainDatabase(this);

Dann führen Sie backup-und restore-Betrieb, wenn es nur auf

@Override
public void onClick(View v) {
    final MainDatabase db = new MainDatabase(getApplicationContext());

    switch (v.getId()) {
        case R.id.tvBackUp:
            String outFileName = Environment.getExternalStorageDirectory() + 
File.separator + getResources().getString(R.string.app_name) + File.separator;
            localBackup.performBackup(db, outFileName);
            break;
        case R.id.tvRestore:
            File folder = new File(Environment.getExternalStorageDirectory() + File.separator + getApplicationContext().getResources().getString(R.string.app_name));
            if (folder.exists()) {

                final File[] files = folder.listFiles();

                if (files.length == 0) {
                    Toast.makeText(this, "No any Backup", Toast.LENGTH_SHORT).show();
                } else {
                    localBackup.performRestore(db);
                }
            }

            break;
    }
}

Stellen Sie eine Methode für die Sicherung Ihrer Datenbank-Datei

public void performBackup(final MainDatabase db, final String outFileName) {

    File folder = new File(Environment.getExternalStorageDirectory() + File.separator 
+ mContext.getResources().getString(R.string.app_name));

    boolean success = true;
    if (!folder.exists())
        success = folder.mkdirs();
    if (success) {

        final Dialog dialog = new Dialog(mContext);
        dialog.setContentView(R.layout.backup_dialog);
        dialog.getWindow().getAttributes().windowAnimations = 
R.style.PauseDialogAnimation;

dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
        dialog.show();

        Button btnSave = dialog.findViewById(R.id.btnSave);
        Button btnCancel = dialog.findViewById(R.id.btnCancel);
        EditText etName = dialog.findViewById(R.id.etName);
        etName.setInputType(InputType.TYPE_CLASS_TEXT);
        btnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String m_Text = etName.getText().toString();
                String out = outFileName + m_Text + ".db";

                db.backup(out);
                dialog.dismiss();
            }
        });
        btnCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
    } else
        Toast.makeText(mContext, "Unable to create directory. Retry", 
Toast.LENGTH_SHORT).show();
}

    public void backup(String outFileName) {

    //database path
    final String inFileName = mContext.getDatabasePath(DATABASE_NAME).toString();

    try {
        File dbFile = new File(inFileName);
        FileInputStream fis = new FileInputStream(dbFile);

        // Open the empty db as the output stream
        OutputStream output = new FileOutputStream(outFileName);

        // Transfer bytes from the input file to the output file
        byte[] buffer = new byte[1024];
        int length;
        while ((length = fis.read(buffer)) > 0) {
            output.write(buffer, 0, length);
        }

        // Close the streams
        output.flush();
        output.close();
        fis.close();

        Toast.makeText(mContext, "Backup Completed", Toast.LENGTH_SHORT).show();

    } catch (Exception e) {
        Toast.makeText(mContext, "Unable to backup database. Retry", 
Toast.LENGTH_SHORT).show();
        e.printStackTrace();
    }
}

Sowie für die Wiederherstellung tun, dieses Ding, Fragen Sie nach, was der Benutzer backup wiederherstellen

public void performRestore(final MainDatabase db) {


    File folder = new File(Environment.getExternalStorageDirectory() + File.separator 
+ mContext.getResources().getString(R.string.app_name));
    if (folder.exists()) {

        final File[] files = folder.listFiles();

        final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(mContext, 
 android.R.layout.select_dialog_item);
        for (File file : files)
            arrayAdapter.add(file.getName());
        AlertDialog.Builder builderSingle = new AlertDialog.Builder(mContext);

        builderSingle.setTitle("Select & Restore ");
        builderSingle.setNegativeButton("cancle", (dialog, which) -> 
dialog.dismiss());
        builderSingle.setAdapter(arrayAdapter, (dialog, which) -> {
            try {
                db.importDB(files[which].getPath());
            } catch (Exception e) {
                Toast.makeText(mContext, "Unable to restore. Retry", 
Toast.LENGTH_SHORT).show();
            }
        });

        builderSingle.show();
    } else
        Toast.makeText(mContext, "Backup folder not present.\nDo a backup before a 
restore!", Toast.LENGTH_SHORT).show();
}

 public void importDB(String inFileName) {

    final String outFileName = mContext.getDatabasePath(DATABASE_NAME).toString();

    try {

        File dbFile = new File(inFileName);

        FileInputStream fis = new FileInputStream(dbFile);

        // Open the empty db as the output stream
        OutputStream output = new FileOutputStream(outFileName);

        // Transfer bytes from the input file to the output file
        byte[] buffer = new byte[1024];
        int length;
        while ((length = fis.read(buffer)) > 0) {
            output.write(buffer, 0, length);
        }

        // Close the streams
        output.flush();
        output.close();
        fis.close();

        Toast.makeText(mContext, "Restore Completed", Toast.LENGTH_SHORT).show();

    } catch (Exception e) {
        Toast.makeText(mContext, "Unable to import database. Retry", 
Toast.LENGTH_SHORT).show();
        e.printStackTrace();
    }
}
+0
2019-09-17 10:13:31

Sind Sie sicher, dass Sie immer nur einen Zuhörer, oder vielleicht haben Sie mehrere Zuhörer, dass alle, die auf den gleichen Punkt, statt jedes Element? Dein Beispiel ist zu kompliziert, zu bekommen arbeiten in einem Ausschnitt, so dass Sie könnte einige Schwierigkeiten haben, bekommen eine Antwort. Aber, ich vermute, es ist Ihr this Referenz, die nicht zu dem, was Sie erwarten, wenn Sie einen click-Ereignishandler ausgeführt wird.

Sie haben zwei AddItems Funktionen. Die erste, schien Missbrauch der this-parameter, aber das Letzte schien, um es einzufangen erfolgreich als ddl an. Sie können überprüfen jedes Einzelteil direkt im browser-devtools, um zu sehen, wenn jeder einen einzigartigen Zuhörer. Wenn ja, sollten Sie formulieren Ihre Frage und versuchen Sie eine kleinere Beispiel, wenn Sie nicht mit Glück bekommen Sie Antworten).

+0
2019-09-17 10:34:24

Beim verketten der innerHTML Eigenschaft für " Container, Sie ersetzen den gesamten Inhalt des DOM-Elements, so verlieren Sie keine bereits gebundene Veranstaltungen. Sie entweder binden von Ereignissen, wenn Sie fertig sind, zunichte gemacht mit innerHTML von Container (das wäre ein workaround, aber immer noch schlecht) oder Sie verwenden einfach die richtige Methode: appendChild:

class Test {
  Items = [];
  constructor(containerID) {
    this.ContainerID = containerID;
    this.Container = document.getElementById(containerID);
  }
  AddItems(items) {
    let itemID, item;
    for (let i = 0; i < items.length; i++) {
      itemID = 'li-' + this.ContainerID + '-' + this.Items.length;
      item = document.createElement('li');
      item.id = itemID;
      item.innerHTML = items[i];
      this.Container.appendChild(item);
      item.addEventListener("click", this.OnClick.bind(this, item))
      this.Items.push(item);
    }
  }
  OnClick(item) {
    alert(item.innerText);
  }
}

var testObject = new Test("test-container");
testObject.AddItems(["Option 1", "Option 2", "Option 3", "Option 4"]);
html,
body {
  height: 100%%;
  margin: 0;
  display: flex;
  align-items: center;
  justify-content: center;
}

ul {
  padding: 0;
  margin: 0;
  list-style-type: none;
  max-height: 200px;
  overflow-y: auto;
}

ul>li {
  padding: 5px;
  margin: 5px;
  cursor: pointer;
  background-color: #333;
  color: #fff;
}
<ul id="test-container"></ul>


Edit: Nicht direkt, aber ich dachte, es sollte erwähnt werden, für pädagogische Zwecke: Bindung ein Ereignis pro Kind sollte vermieden werden, wenn möglich, weil:

  • es ist schwerer (spürbar beim Umgang mit großen Mengen von Kindern)
  • wenn Sie ein update für die Kinder dynamisch, Sie don ' T haben eine API, um die Kinder, die nicht einer bestimmten Bindung; und vergessen, zu binden, neue Mitglieder sofort nach Ihnen angehängt, Sie ist eine einfache Fehler zu machen

Aber Sie können die Vorteile der Ereignis-bubbling": Sie binden nur ein Ereignis auf die Muttergesellschaft. Dies funktioniert auch auf Kinder, die nicht im DOM, wenn Sie die Bindung. Ihr aktualisiertes Beispiel:

class Test {
  Items = [];
  constructor(id) {
    this.Container = document.getElementById(id);
    this.Container.addEventListener("click", this.OnClick.bind(this));
  }
  AddItems(items) {
    let item;
    for (let i = 0; i < items.length; i++) {
      item = document.createElement("li");
      item.id = `li-${this.Container.id}-${this.Items.length}`;
      item.innerHTML = items[i];
      this.Container.appendChild(item);
      this.Items.push(item);
    }
  }
  OnClick(event) {
    const item = event.target.closest(`#${this.Container.id} li`);
    if (item) {
      alert(item.innerText);
    }
  }
}

const testObject = new Test("test-container");
testObject.AddItems(["Option 1", "Option 2", "Option 3", "Option 4"]);
html,
body {
  height: 100%%;
  margin: 0;
  display: flex;
  align-items: center;
  justify-content: center;
}

ul {
  padding: 0;
  margin: 0;
  list-style-type: none;
  max-height: 200px;
  overflow-y: auto;
}

ul>li {
  padding: 5px;
  margin: 5px;
  cursor: pointer;
  background-color: #333;
  color: #fff;
}
<ul id="test-container"></ul>

Wie Sie sehen können, auch wenn die Bindung erfolgt, in constructor, was passiert, bevor Sie hinzufügen der <li>s, es funktioniert und es wird immer noch funktionieren, wenn Sie Sie löschen und andere hinzuzufügen. Und es ist nur eine verbindliche, das für alle gegenwärtigen und zukünftigen Kinder.

Hinweis: ich habe die OnClick-Methode nicht mehr überschreiben der default param (was event) und es verwenden, um wählen Sie die <li>, wenn die Methode aufgerufen wird.

+0
2019-09-17 10:34:24

Sehen Sie sich andere Fragen zu Tags an