2016-03-31 14 views
10

Powszechnie stosowane narzędzie do pracy z listami uzyskuje dostęp do metody listy z elementu listy. Na przykład: element projektu ma opcję usunięcia samego siebie z listy zawierającej. Chciałbym wiedzieć, czy wzór opisany poniżej dla Aurelii jest ważny, czy może są lepsze rozwiązania.Aurelia: Dostęp do rodzicielskiej metody VM z poziomu dziecka VM

W Aurelia Mam następującą konfigurację:

Zawierający lista: (projekt-list.html i projectList.js)

<template>  
    <div class="projects"> 
    <input value.bind="newProjectName" placeholder="New project name"/> 
    <project-item repeat.for="project of projects" project.bind="project"></project-item> 
    </div> 
</template> 

a element dziecko: (projekt-item i projectItem. kd)

<template> 
    <span class="title"> 
    ${project.name} <i click.delegate="deleteProject(project)" class="icon-trash"></i> 
    </span> 
</template> 

W tym przypadku deleteProject(project) jest członkiem projectList VM:

function deleteProject(project){ 
    var index = this.projects.indexOf(project); 
    if (index>-1){ 
     this.projects.splice(index,1) 
    } 
} 

Niestety, jak rozumiem z tego numeru, https://github.com/aurelia/framework/issues/311, , które nie będzie działać (już).

Jako obejście można powiązać funkcję nad projektem pozycja-VM:

@bindable delete: Function; 

aw project-listy Szablon:

<project-item repeat.for="project of projects" project.bind="project" delete.bind="deleteProject"></project-item> 

To nie praca, świadczenia związany funkcja jest przypisaną właściwością z zamknięciem:

deleteProject = function(project : Projects.Project){ 
     var index = this.projects.indexOf(project); 
     if (index>-1){ 
      _.remove(this.projects,(v,i)=>i==index); 
     } 
    } 

Zamknięcie jest potrzebne, aby uzyskać dostęp do właściwego kontekstu (this będącą listą projektów). Korzystanie z może odnosić się do kontekstu elementu projektu.

Chociaż ta konstrukcja działa i nie ma dużo napowietrznych w kanalizacji, to czuje do mnie trochę kruche:

  • Przypisany funkcja jest trudne do odróżnienia wiążącej formie funkcję jako zwykły klasy funkcji
  • jak również pozycja listy wydaje się nieco "przesadzona":

A może brakuje mi mechanizmu bulgotania Aurelii, który umożliwia dostęp do macierzystej maszyny wirtualnej obsługiwanej przez framework?

Edit po odpowiedzi: podstawie Odpowiedź @Sylvain Zrobiłem GistRun która implementuje listy szkielet i list-item realizację z dodawania i usuwania:

Aurelia Skeleton list list-item implementation

Odpowiedz

10

Oto kilka alternatyw dla przekazując odwołanie do funkcji:

  • Czy składnik dziecko transmitować wydarzenie publiczne używając EventAggregator singleton instancji i mają dominującą składową R eact do zdarzenia

  • mieć komponent dziecko nadawane prywatną imprezę korzystając prywatną EventAggregator instancji i mają składnik nadrzędny reagować na zdarzenia

  • mieć komponent dziecko transmitować wydarzenie DOM i powiązać go z rodzicem z delete.call jak ta <project-item repeat.for="project of projects" project.bind="project" delete.call="deleteProject($even t)"></project-item>

moich osobistych preferencji jest trzecia opcja. Wydaje mi się bardziej podobny do "Komponentów sieciowych".

+0

Używam również trzeciej opcji. Zauważ, że gdy masz 'delete.call =" deleteProject (projectParam) "', musisz wywołać to z 'project-item' jak' this.delete ({projectParam: this.project}) ' – valichek

+0

Trzecia opcja przy użyciu ".call' binding to zdecydowanie to, czego szukałem. Nadal mam problem z parametrem. @Sylvain: w odpowiedzi używasz '$ event'. To działa i 'deleteProject' jest wywoływany z projektem jako parametrem. Również 'delete.call =" deleteProject (project) "' powoduje poprawne wywołanie. Czy możesz wyjaśnić, co oznacza parametr $ event w tym kontekście? – Arjan

+0

@valichek: Zakładam, że przez "wywołanie go z elementu projektu" masz na myśli z klasy viewmodel. Próbowałem Twojej sugestii, ale nie mogę jej uruchomić. Próbowałem: 'function doDelete() {this.delete (this.project); } 'w klasie' projectItem'. Ale "this.delete" jest niezdefiniowane. Sądzę więc, że nie jest to zamierzone? – Arjan

Powiązane problemy