Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Связь структурированных данных и DOM (https://javascript.ru/forum/misc/71800-svyaz-strukturirovannykh-dannykh-i-dom.html)

Luca 13.12.2017 17:27

Связь структурированных данных и DOM
 
Здравствуйте.
console.clear();
const obj = {
    first: {
     text: "child",
     }
}
let root = document.createElement('div')
root.innerHTML = obj.first.text
let wM = new WeakMap()
wM.set(root, obj.first)
root.addEventListener("click", (e)=>  {  e.currentTarget.classList.add("dn")
    delete wM.get( e.currentTarget ) // здесь не удаляет
    console.log( wM.get( e.currentTarget ) )
    console.log( obj.first === wM.get( e.currentTarget ) )
}
)
document.body.appendChild(root)

подскажите, как удалять в подобных случаях?

рони 13.12.2017 17:36

Luca,
wM.delete( e.currentTarget )

Luca 13.12.2017 18:06

Цитата:

Сообщение от рони (Сообщение 472836)
Luca,
wM.delete( e.currentTarget )

вопрос в другом: "как удалить узел в исходной струтуре данных obj, те как удалить obj.first, но используя ссылку из wM или другой структуры? значения должны формироваться в цикле, без obj.first и тп Или запоминать все уровни, а потом удалять [${obj}].[${first}], но это как-то не гуд, имхо..."

рони 13.12.2017 19:02

Luca,
не понимаю, ждите специалистов.

Luca 13.12.2017 19:44

Цитата:

Сообщение от рони (Сообщение 472847)
Luca,
не понимаю, ждите специалистов.

смотрите, в чём вопрос:
например есть объект с тремя подобъектаим
let threeDivs = {
    div1:{
        text: "it's div1"
    },
    div2:{
        text: "it's div2"
    },
       div3:{
        text: "it's div3"
    },
}

далее, в цикле, мы проходим по структуре
for(let elem in threeDivs){
    let div = document.createElement("div")
    div.innerHTML = elem.text
    div.addEventListener("click", (e)=>{ 
    e.currentTarget.remove()
     // здесь же надо предусмотреть удаление elem 
    })
}

те надо удалить дом узел и соответствущий объект из структуры,
я попытался через WeakMap связать данные, чтобы по e.currentTarget получать ссылку на объект, который надо удалить.
структура может быть любой: массивы, объекты...
надеюсь понятно объяснил

рони 13.12.2017 19:56

Luca,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">


</head>

<body>
<div id="slider"></div>
<script>
  "use strict"
let threeDivs = {
    div1:{
        text: "it's div1"
    },
    div2:{
        text: "it's div2"
    },
       div3:{
        text: "it's div3"
    }
}
Object.keys(threeDivs).forEach(function(elem) {
    let div = document.createElement("div")
    div.innerHTML = threeDivs[elem].text;
    div.addEventListener("click", (e)=>{
    document.body.removeChild(div);
    delete threeDivs[elem];
    console.log(threeDivs)
    });
    document.body.appendChild(div)
})


  </script>
</body>
</html>

Luca 13.12.2017 20:04

сложность в том, что структура может быть сложнее, например
let msgs = {

   msg1: {
       submsg1: { },
       submsg2: { },
       submsg3: { }
   }

}

те уровень вложенности может быть любой и посему ссылаться divs[key] не правильно - вот я о чём.
ссылку при обходе всех элементов я могу, но как потом, имея ссылку удалить объект?

рони 13.12.2017 20:08

Цитата:

Сообщение от Luca
те уровень вложенности может быть любой

а что это меняет в предложенном коде пост №6 ?

рони 13.12.2017 20:12

Luca,
если у вас есть только msgs и submsg, то вам нужен обход всего дерева обьекта, а если только msg1 и submsg, тогда достаточно предложенного выше

Luca 13.12.2017 20:17

Цитата:

Сообщение от рони (Сообщение 472856)
а что это меняет в предложенном коде пост №6 ?

надо тогда запоминать что-то типа
delete msgs.msg1.submsg1.subsubmsg1

рекурсивно проходя по дереву легко получить ссылку на текущий объект, но... можно, конечно, делать рекурсивные вызовы с передачей текущего поддерева...
вопрос в том: можно ли удалить объект произволной вложенности имея ссылку на этот объект, не имея ссылки на родителские объекты?


Часовой пояс GMT +3, время: 08:29.