Hans Karlsen (talk | contribs) |
No edit summary |
||
Line 3: | Line 3: | ||
In the EXT_Components folder you can put sub folders | In the EXT_Components folder you can put sub folders | ||
- each sub folder will | - each sub folder will constitute one Component - the name of the folder is the component name. | ||
Each component can have js scripts to be loaded when angular app starts - all js found here will be loaded | Each component can have js scripts to be loaded when angular app starts - all js found here will be loaded |
Revision as of 09:06, 9 April 2019
In the Turnkey Web application you will find a folder EXT_Components.
In the EXT_Components folder you can put sub folders
- each sub folder will constitute one Component - the name of the folder is the component name.
Each component can have js scripts to be loaded when angular app starts - all js found here will be loaded
Each component must have a cshtml file for content structure - name this <component name>.cshtml
Each component probably has css style sheets - all css found here will be loaded - if <name>.min.css is found then <name>.css is skipped
Use in the model
Use a component in MDriven Designer by setting UIOverride on ViewModelColumn and:
tagged value Angular_Ext_Component=<component name>
Implement a simple column override
If your component is very simple - you only want to change the HTML that we generate for the ViewModelColumn - you can do as described in this video
The binding in your replacement html takes this form:
<input ng-model='data.TheViewModelColumnToBindTo'/>
But that will require you to do a new component for each unique column (TheViewModelColumnToBindTo1,TheViewModelColumnToBindTo2).
To mitigate that need we do like this when compiling your replacement HTML:
OverrideDiv.AppendHtml(args.ResultingOverrideHTML.Replace("[ViewModelColumnName]", e.ViewModelColumn.RuntimeName));
This means that to write a more generic replacement control use an expression like this:
<input ng-model='data.[ViewModelColumnName]'/>
Update: We now also search and replace "[ViewModelClassName]". This means that you can write this ng-model='vCurrent_[ViewModelClassName]' to bind to the vCurrent variable of the ViewModelClass that has the component.
Update2: We now also search and replace "[ViewModelColumnLabel]". This means that you can write this <div>[ViewModelColumnLabel]</div> to use the columns designed presentation string in your component.
Implement a Component with js,css and html
Example:
****** HTML - save as EXT_Components/test1/test1.cshtml ****** <!-- notice the use of test1 - it is an angular directive that we defines in the js further down --> <div test1 class="test1background"> </div>
****** CSS - save as EXT_Components/test1/test1.css ****** .test1background { background: pink; }
****** Javascript - save as EXT_Components/test1/test1.js ****** function InstallTheDirectiveFor_test1(streamingAppController) { streamingAppController.directive('test1', ['$document', function ($document) { return { link: function (scope, element, attr) { // THIS IS WHERE YOU SEE THE HTML(element) AND THE DATA (scope) FOR EVERYTHING THAT USE OUR DIRECTIVE (test1) var c = document.createElement('canvas'); element[0].appendChild(c); } }; }]); console.trace("test1 component Loaded"); } InstallTheDirectiveFor_test1(angular.module(MDrivenAngularAppModule));
If you use Typescript instead of javascript you can use this code:
****** Typescript if you prefer- save as EXT_Components/test1/test1.ts (js is generated by ts) ****** /// <reference path="../../Scripts/typings/jquery/jquery.d.ts" /> /// <reference path="../../Scripts/typings/angularjs/angular.d.ts" /> /// <reference path="../../js/MDrivenAngularApp.ts" /> namespace test1Namespace { function InstallTheDirectiveFor_test1(streamingAppController) { streamingAppController.directive('test1', ['$document', function ($document) { return { link: function (scope, element: HTMLDivElement[], attr) { let c: HTMLCanvasElement = document.createElement('canvas'); element[0].appendChild(c); } }; }]); console.trace("test1 component Loaded"); } InstallTheDirectiveFor_test1(angular.module(MDrivenAngularAppModule)); }
When using Typescript you may want to include a file like the one below to trigger the correct output:
*********** IF YOU USE TYPESCRIPT Consider adding this file to your folder tsconfig.json with content: { "compileOnSave": true, "compilerOptions": { "noImplicitAny": false, "noEmitOnError": true, "removeComments": false, "sourceMap": true, "target": "es5" }, "exclude": [ "node_modules" ] }
To get global scripts to run before loading of components look at AppWideAngularScriptIncludes