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
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
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
@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