Не удается контролировать положение .appendChild () после .cloneNode () - PullRequest
0 голосов
/ 28 мая 2020

Перво-наперво, извините, но код просто не запускается во фрагменте. Ни codepan, ни jsfiddle. Я все еще загружаю его сюда, но, может быть, попробую запустить его локально. Я использую проект Angular CLI в WebStorm.

В своем приложении я хочу создать что-то вроде списка дел. При нажатии на «Создать новый список» рядом с ним должен быть создан новый прямоугольник (карта дел). Не ниже, не сверху, а справа.

Я сделал .cloneNode() и .appendChild(). Это помогает, но моя проблема в том, что я не могу контролировать расположение результата .appenChild(). Он всегда вставляет новую карточку дел под существующей.

Пожалуйста, кто-нибудь успокоит мой разум !!

import { Component } from '@angular/core'

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})

export class AppComponent {
  title = 'ShoppingList'; // application name
  products = []; // array declaration
  itemToAdd;
  itemToRemove;

  /* --- adds an item in the array --- */
  addNewItem () {
    if (this.itemToAdd !== null) {
      this.products.push(this.itemToAdd)
    }
  }

  /* --- removes all items from array --- */
  removeItem () {
    const index = this.products.indexOf(this.itemToRemove)
    if (index > -1) {
      this.products.splice(index)
    }
  }

  /* --- creates new list  --- */
  createNewList () {
    const elementToClone = document.getElementById('listCard')
    const clone = elementToClone.cloneNode(true)
    document.getElementById('mainContent').appendChild(clone)
    console.log(this.products)
    console.log(clone)
  }
}
.mainContent {
  display: flex;
  flex-direction: column;
  align-items: center;
  border: 1px solid black;
}

ul {
  list-style: none none;
  margin-left: 0;
  padding-left: 0;
}

.listCard {
  width: 200px;
  height: 300px;
  border: 1px solid black;
  border-radius: 5px;
  margin: 20px;
}

.listTextAndButtons {
  display: flex;
  flex-direction: column;
  border: 1px solid black;
  padding: 5px;
  margin: 0 20px 20px 20px;
}

.textAreas {
  display: flex;
}

.addRemoveButtons {
  display: flex;
  align-items: center;
  justify-content: center;
}

.createNewListButton {
  display: flex;
  justify-content: center;
}

textarea {
  margin: 5px;
  border: 1px solid #767676;
  border-radius: 4px;
}

button {
  margin: 5px;
  width: 70%;
  height: 30px;
  border: 1px solid #767676;
  border-radius: 4px;
}
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>ShoppingList</title>
  <base href="/">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon">
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
</head>

<body>

<div id="mainContent" class="mainContent">

  <div id="listCard" class="listCard"></div>

  <div class="listTextAndButtons">
    <label class="textAreas">
      <textarea [(ngModel)]="itemToAdd"></textarea>
      <textarea [(ngModel)]="itemToRemove"></textarea>
    </label>

    <div class="addRemoveButtons">
      <button (click)="addNewItem()">Add New Item!</button>
      <button (click)="removeItem()">Remove an Item!</button>
    </div>

    <div class="createNewListButton">
      <button (click)="createNewList()">Create a New List!</button>
    </div>
  </div>

</div>
</body>
</html>

1 Ответ

1 голос
/ 28 мая 2020

Здесь я создал stackblitz , посмотрите. Я удалил

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>

из шаблона HTML, так как вы, очевидно, используете angular 2+

Что касается flexbox, я дал listCard свойство max-width и установил flex-wrap: wrap на .listTextArea, направление - row по умолчанию, поэтому новые элементы будут добавляться вправо, пока они не достигнут максимальной ширины, а затем переносятся на новую строку. Я всегда ссылаюсь на эту CSS статью с хитростями , когда дело касается flexbox

.listCard {
    max-width: 600px;
    border: 1px solid black;
    margin-bottom: 15px;
}

.listTextArea {
  display: flex;
  flex-wrap: wrap;
}

Кроме того, я бы рекомендовал следовать тому же шаблону для списков, что и для элементов внутри списка. например, вместо клонирования и добавления нового узла храните списки в массиве и l oop через него с помощью * ngFor

<div class="listCard" *ngFor="let list of todoLists">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...