2

Say I have a simple view model (widget.js):

import {Behavior} from 'aurelia-framework';

export class Widget
{
    static metadata() { return Behavior.customElement('widget') }

    constructor()
    {
        this.title= "AwesomeWidget";
    }
}

With the following view: (widget.html):

<template>
    <div>${title}</div>
</template>

Now say I inject some markup like this into the DOM:

    var markup       = `<div><widget></widget></div>`;
    var $markup      = $(markup);
    var $placeholder = $("#placeholder");

    $placeholder.append($markup);

How can I now tell Aurelia to compile this newly added part of the DOM against a new instance of Widget? I know it involves ViewCompiler but need an example to help me along. I'd greatly appreciate any help. Thanks!

Jeremy Danyow
  • 26,470
  • 12
  • 87
  • 133
CHS
  • 965
  • 2
  • 18
  • 29

2 Answers2

3

Here's an example: https://gist.run/?id=762c00133d5d5be624f9

It uses Aurelia's view compiler to compile the html and create a view instance, bound to the supplied view-model.

view-factory.js

import {
  inject,
  ViewCompiler,
  ViewResources,
  Container,
  ViewSlot,
  createOverrideContext
} from 'aurelia-framework';

@inject(ViewCompiler, ViewResources)
export class ViewFactory {
  constructor(viewCompiler, resources, container) {
    this.viewCompiler = viewCompiler;
    this.resources = resources;
    this.container = container;
  }

  insert(containerElement, html, viewModel) {
    let viewFactory = this.viewCompiler.compile(html);
    let view = viewFactory.create(this.container);
    let anchorIsContainer = true;
    let viewSlot = new ViewSlot(containerElement, anchorIsContainer);
    viewSlot.add(view);
    view.bind(viewModel, createOverrideContext(viewModel));
    return () => {
      viewSlot.remove(view);
      view.unbind();
    };
  }
}

Usage:

let view = this.viewFactory.insert(containerElement, viewHtml, viewModel);
Jeremy Danyow
  • 26,470
  • 12
  • 87
  • 133
  • How do you do you cleanup the compiled html? I seem to remember needing to attach/detach. – CHS Aug 24 '15 at 12:41
3

A few months ago the TemplatingEngine class got a newly accessible enhance API method. This shortcuts the need to manually use the viewCompiler and compile method which was originally the only easy approach. This blog post details how you can use the enhance API to Aureliaify dynamically added HTML in your pages.

This has the added benefit of not needing to clean up the compiled HTML or detach anything either.

Dwayne Charrington
  • 6,524
  • 7
  • 41
  • 63
  • I have a post (http://stackoverflow.com/questions/41745160/how-can-i-compose-a-vm-into-a-view-within-an-aurelia-validation-renderer) and I was pointed to this post as a help. Was wondering if you could give details on how to implement TemplatingEngine in my scenario – RHarris Jan 19 '17 at 20:45