File: builder2.html

package info (click to toggle)
libjs-angular-schema-form 0.8.13-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,564 kB
  • sloc: javascript: 17,261; makefile: 16
file content (75 lines) | stat: -rw-r--r-- 3,549 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<!DOCTYPE html>
<html ng-app="builderExample">
  <head>
    <meta charset="utf-8">
    <title>Builder example</title>
  </head>
  <body>

    <div custom-build></div>

    <script src="../bower_components/angular/angular.js" charset="utf-8"></script>
    <script src="../dist/schema-form.js" charset="utf-8"></script>
    <script src="../bower_components/objectpath/lib/ObjectPath.js"></script>

    <script type="text/javascript">
      angular.module('builderExample', ['schemaForm'])
             .run(function($templateCache) {
               // A template to use
               $templateCache.put('example-template.html', '<h1>Hello {{world}}</h1>');
               $templateCache.put('fieldset-template.html', '<fieldset><legend>Legend</legend></fieldset>');
             })
             .directive('customBuild', function($compile, sfBuilder) {
               return {
                 link: function(scope, element, attrs) {
                   scope.world = 'World';

                   // First a "canonical form definition", usually this is created by merging form
                   // definition from user and a schema.
                   // This time its a nested structure with a fieldset around our example type
                   var formDef = [
                     {
                       type: 'fieldset',
                       items: [{type: 'example'}]
                     }
                   ];

                   // A "builder", i.e. a helper function to get the fieldset to actually contain its
                   // children.
                   var fieldsetBuilder = function(args) {
                     // The `args` options object contains lot's of useful stuff, the form definition,
                     // the documentFragment of the current template, and a builder function to call
                     // when recursively building children.

                     // We access the form definition through args.form, and we've put our children
                     // under "items", so we call the builder recursively to build them.
                     var children = args.build(args.form.items);

                     // What we get is documentFragment that we plop inside the fieldset.
                     args.fieldFrag.firstChild.appendChild(children);
                   };

                   // A decorator is just an object that matches form `type` to a metadata object
                   // `replace` property is a boolean, if false the "old" way to build forms is
                   //  used for backwards compatability.
                   // `builder` is a function or a list of helper functions to manipulate the DOM during the build.
                   // For example to set proper ng-model value, or include child items
                   var decorator = {
                     example: {template: 'example-template.html', replace: true, builder: []},
                     fieldset: {template: 'fieldset-template.html', replace: true, builder: fieldsetBuilder},
                   };

                   // The builder creates a nice document fragment for you to place in the form.
                   var documentFragment = sfBuilder.build(formDef, decorator);

                   // Then plop the fragment into the element
                   element[0].appendChild(documentFragment);

                   // It isn't compiled yet though, so let's do that.
                   $compile(element.children())(scope);
                 }
               };
             });
    </script>
  </body>
</html>