2016-03-24 16 views
11

Ho un oggetto ricorsivo a mio avviso il modello Aurelia che assomiglia a questo:Aurelia - Definizione in linea di elemento HTML-only personalizzato

Class BottomlessPit { 
    Name: string = ''; 
    MorePits: BottomlessPit[] = null; 
} 

Pertanto, vorrei utilizzare un modello ricorsivo a mio avviso Aurelia . Sarà usato solo in un posto, quindi preferirei usare un modello letterale. Ecco alcuni pseudocodici che non funzionano:

<template name="pit"> 
    <li> 
     ${Name} 
     <compose view.bind="pit" repeat.for="subpit of MorePits"></compose> 
    </li> 
</template> 

Questa è una funzionalità di Aurelia?

+0

Si può fare quello che si stanno cercando utilizzando il modello di dentro di sé, ma il browser andrà in crash con overflow dello stack –

risposta

8

OK questo male la mia testa un po ', ma qui è un modo per consentire la definizione di elementi Inline HTML-solo su ordinazione ...

https://gist.run?id=11ac077048cab0ad9979

app.html

<template> 
    <h1>Aurelia - Inline Custom Elements</h1> 

    <template name="person-element" bindable="person"> 
    <h3>${person.name}</h3> 
    <person-element repeat.for="parent of person.parents" person.bind="parent"></person-element> 
    </template> 

    <template name="hello" bindable="message"> 
    ${message} 
    </template> 

    <person-element person.bind="kid"></person-element> 

    <hello message="hello world"></hello> 
</template> 

app.js

export class App { 
    kid = { 
    name: 'North West', 
    parents: [ 
     { 
     name: 'Kanye West', 
     parents: [] 
     }, 
     { 
     name: 'Kim Karsomething', 
     parents: [] 
     } 
    ] 
    }; 
} 

main.js

import {relativeToFile} from 'aurelia-path'; 
import {Origin} from 'aurelia-metadata'; 
import {TemplateRegistryEntry, TemplateDependency} from 'aurelia-loader'; 

// override the TemplateRegistryEntry's "template" property, adding 
// logic to process inline custom elements (eg <template name="foo">) 
let templateDescriptor = Object.getOwnPropertyDescriptor(TemplateRegistryEntry.prototype, 'template'); 
Object.defineProperty(TemplateRegistryEntry.prototype, 'standardTemplate', templateDescriptor); 
Object.defineProperty(TemplateRegistryEntry.prototype, 'template', { 
    get: function get() { 
    return this.standardTemplate; 
    }, 
    set: function set(value) { 
    // hand off to the standard template property... 
    this.standardTemplate = value; 

    let address = this.address; 

    // loop through each of the inline custom elements and register 
    // them as dependencies. 
    let namedTemplates = value.content.querySelectorAll('template[name]:not([name=""])'); 
    for (var i = 0, ii = namedTemplates.length; i < ii; ++i) { 
     let current = namedTemplates[i]; 
     let name = current.getAttribute('name'); 
     let id = relativeToFile(`./${name}.html`, address); // potential for collision but putting in subfolder would be weird if the inline element had it's own <require> elements 

     // give the loader the template html 
     System.set(
     id + '!' + System.normalizeSync('text'), 
     System.newModule({ __useDefault: true, default: current.outerHTML})); 

     // register the dependency 
     this.dependencies.push(new TemplateDependency(id, name)); 

     // remove the inline template element from the template 
     current.parentNode.removeChild(current); 
    } 
    } 
}); 

export function configure(aurelia) { 
    aurelia.use 
    .standardConfiguration() 
    .developmentLogging(); 

    aurelia.start().then(() => aurelia.setRoot()); 
} 
+0

Attualmente sto facendo questo, ma come è noto, "E ' sarà usato solo in un posto, quindi preferirei usare un modello letterale. " –

+0

ah- inizialmente non ero sicuro di cosa intendessi lì- penso di capire ora ... vuoi mettere il modello ricorsivo in linea nel tuo markup –

+0

che è esattamente giusto –

Problemi correlati