Dynamic Content Projection in Angular 2+
$ npm install --save ng-dynamic
Live Demo: Plunker
We often need to project some dynamic contents into your Angular app. For example, if you make a markdown editor, you want to display the rendererd preview.
@Component({
selector: 'html-preview',
template: '<div [innerHTML]="html"></div>',
})
export class HTMLPreviewComponent {
@Input() html: string;
}
This code has some problems:
[innerHTML]
will sanitize its value and strip some elements.<my-button>
don't work.ng-dynamic can solve these problems by using standard Angular APIs and some hacks.
<dynamic-html [content]="html">
<dynamic-html>
is a component to render given HTML string and mount components in the HTML.
Example:
@Component({
selector: 'my-button',
template: `<button (click)="onClick()">Click Me</button>`
})
export class MyButtonComponent {
onClick() {
}
}
@Component({
selector: 'my-app',
template: `
<dynamic-html [content]="content"></dynamic-html>
`
})
export class AppComponent {
content = `
<article>
<h1>Awesome Document</h1>
<div>
<p>bla bla bla</p>
<my-button></my-button>
</div>
</article>
`;
}
@NgModule({
imports: [
DynamicHTMLModule.forRoot({
components: [
{ component: MyButtonComponent, selector: 'my-button' },
]
})
],
declarations: [AppComponent, MyButtonComponent],
bootstrap: [AppComponent]
})
export class AppModule {
}
Result:
<my-app>
<dynamic-html>
<article>
<h1>Awesome Document</h1>
<div>
<p>bla bla bla</p>
<my-button>Click Me</my-button>
</div>
</article>
</dynamic-html>
</my-app>
<my-button>
is resolved as MyButtonComponent
.
DynamicHTMLModule
To use <dynamic-html>
, you have to import DynamicHTMLModule
with forRoot
static method.Its argument is a DynamicHTMLOptions
object:
/**
* defines dynamic-projectable components
*
* ```ts
* @Component({
* selector: 'child-cmp',
* template: `<p>child:{{text}}</p>`,
* })
* class ChildCmp {
* @Input() text: string;
* }
*
* DynamicHTMLModule.forRoot({
* components: [
* { component: ChildCmp, selector: 'child-cmp' } },
* ]
* })
* ```
*/
export interface ComponentWithSelector {
/**
* component's selector
*/
selector: string;
/**
* component's type
*/
component: Type<any>;
}
/**
* options for DynamicHTMLModule
*/
export class DynamicHTMLOptions {
/**
* identifies components projected in dynamic HTML.
*/
components: Array<ComponentWithSelector>;
}
OnMount
Lifecycle method/**
* Lifecycle hook that is called after instantiation the component.
* This method is called before ngOnInit.
*/
export abstract class OnMount {
abstract dynamicOnMount(attrs?: Map<string, string>, innerHTML?: string, element?: Element): void;
}
OnMount
allows you to create component has hybrid content projection.hybrid content projection means that the component can project its content from even static template or dynamic HTML.
See also demo.
@Component({
selector: 'awesome-button',
template: `<button (click)="onClick()" #innerContent><ng-content></ng-content></button>`,
})
export class AwesomeButtonComponent implements OnMount, OnInit {
@Input() msg: string;
@ViewChild('innerContent') innerContent: ElementRef;
dynamicOnMount(attr: Map<string, string>, content: string) {
this.msg = attr.get('msg');
this.innerContent.nativeElement.innerHTML = content;
console.log(`onMount: ${this.msg}`);
}
ngOnInit() {
console.log(`onInit: ${this.msg}`);
}
onClick() {
console.log('clicked');
}
}
<dynamic-html>
Constraints[content]
is not a template. so it cannot resolve {{foo}}
, *ngIf
and any template syntax.*dynamicComponent="template"
dynamicComponent
is a directive to create dynamic component which has the template.
Example:
@Component({
selector: 'dynamic-cmp-demo',
template: `
<div *dynamicComponent="template; context: {text: text};"></div>
`,
})
export class DynamicCmpDemoComponent {
template = `
<article>
<h1>Awesome Document</h1>
<div>
<p>{{text}}</p>
<my-button></my-button>
</div>
</article>
`;
text = 'foo';
}
@NgModule({
imports: [
CommonModule,
],
declarations: [
MyComponent
],
exports: [
MyComponent
]
})
export class SharedModule { }
@NgModule({
imports: [
BrowserModule,
FormsModule,
SharedModule,
DynamicComponentModule.forRoot({
imports: [SharedModule]
}),
],
declarations: [
AppComponent,
DynamicCmpDemoComponent,
],
bootstrap: [AppComponent]
})
export class AppModule {
}
Result:
<my-app>
<ng-component>
<article>
<h1>Awesome Document</h1>
<div>
<p>foo</p>
<my-button>Click Me</my-button>
</div>
</article>
</ng-component>
</my-app>
<my-button>
is resolved as MyButtonComponent
.
DynamicComponentModule
To use dynamicComponent
, you have to import DynamicComponentModule
with forRoot
static method.Its argument is a NgModule
metadata object:
/**
* Setup for DynamicComponentDirective
*
* ```ts
* @NgModule({
* imports: [
* DynamicComponentModule.forRoot({
* imports: [CommonModule]
* })
* ],
* })
* class AppModule {}
* ```
*/
dynamicComponent
ConstraintsdynamicComponent
needs JitCompiler
. You cannot use AoT compilation with DynamicComponentModule.
MIT
npm i && npm run demo # and open http://localhost:8080
Contributions welcome!
http://stackoverflow.com/questions/18900308/angularjs-dynamic-ng-pattern-validation http://jsfiddle.net/2G8gA/1/ 转载于:https://www.cnblogs.com/skating/p/6293283.html
ng-form用来在一个表单内部嵌套另一个表单。普通的HTML <form>标签不允许嵌套,但ng-form可以。 这意味着内部所有的子表单都合法时,外部的表单才会合法。这对于用ng-repeat动态创建表单是非常有用的。 由于不能通过字符插值来给输入元素动态地生成name属性,所以需要将ng-form指令内每组重复的输入字段都包含在一个外部表单元素内。 下面的CSS类会根据表单的验证状态自动设置
本文翻译自:Way to ng-repeat defined number of times instead of repeating over array? Is there a way to ng-repeat a defined number of times instead of always having to iterate over an array? 有没有办法重复定义的次数而不是
http://realityonweb.com/angularjs/angularjs-conditional-display-using-ng-show-ng-hide-ng-if-ng-include-ng-switch/ Hiding or showing parts of a DOM based on some conditions is a common requirement. Ang
1 <!doctype html> 2 <html lang="en" ng-app="myApp"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" 6 content="width=device-width, user-scalable=no, initial-scale=1.0,
本文转自:https://stackoverflow.com/questions/23396398/ng-grid-auto-dynamic-height I think I solved this problem perfectly after 48 hours, var app = angular.module('app', ['ngTouch', 'ui.grid', 'ui.g
由于AngularJS中用来取代<form>的ng-form指令可以嵌套,并且外部表单在所有子表单都合 法之前一直处于不合法状态,因此我们可以在动态生成子表单的同时使用表单验证功能。是的, 鱼和熊掌可以兼得。 <!doctype html> <html ng-app="myApp"> <head> <link rel="stylesheet" href="//cdn.jsdelivr.net/
<!DOCTYPE html> <html ng-app="myApp"> <head> <meta charset="utf-8"> <title></title> </head> <body> <form name="signup_form" ng-controller="FormController" ng-submit="submitForm()" > <di
立Flag 学习Ng - 缓存及压缩&动静分离&https 动静分离 缓存配置及Gzip配置 https配置 缓存及压缩 location ^~ /qq.png { # expires 2s;#缓存2秒 expires 2m;#缓存2分钟 # expires 2h;#缓存2小时 # expires 2d;#缓存2天 root html/gzip; } locati
本文主要介绍使用Flume传输数据到MongoDB的过程,内容涉及环境部署和注意事项。 一、环境搭建 1、flune-ng下载地址:http://www.apache.org/dyn/closer.cgi/flume/1.5.2/apache-flume-1.5.2-bin.tar.gz 2、mongodb java driver jar包下载地址:https://oss.sonatype.o
angularjs 不能直接使用,但 angular 2+ 支持它(在服务器上使用 nodejs:https ://angular.io/guide/universal )。 我有一个相同的需求,我记得尝试使用在 selenium webdriver 中运行在服务器上的 angularjs 来实现你想要的,但我找不到一个完整和简单的解决方案。 相反,我复制了我的 ng-repeat 模板并将它们转
问题内容: 我试图了解和/ 之间的区别,但对我来说它们看起来相同。 我应该记住使用一个或另一个来区别吗? 问题答案: ngIf 该指令根据表达式 删除或重新创建 DOM树的一部分。如果赋值为的表达式的计算结果为假值,则将元素从DOM中删除,否则将元素的克隆重新插入DOM中。 删除元素时,使用它的作用域将被销毁,并在恢复该元素时创建一个新的作用域。在内部创建的作用域使用原型继承从其父作用域继承。 如
问题内容: 任何人都可以为该JSFiddle提供正确的方法: JsFiddle链接 我正在尝试通过.class&#ID更改元素的类。 提前致谢 感谢tymeJV,新的JSFiddle: 解 问题答案: 正确的方法是根据切换变量使用,请考虑: CSS: JS: HTML: 通过根据变量(“ toggle”)是否为或分配引用的类(在上面为“红色”)来工作。
问题内容: 我了解这一点,并会影响在元素上设置的类,并控制是否将元素呈现为DOM的一部分。 有没有对选择的准则在/ 或反之亦然? 问题答案: 取决于您的用例,但总结不同之处: 将从DOM中删除元素。这意味着您所有的处理程序或所有附加到这些元素的内容都将丢失。例如,如果将单击处理程序绑定到子元素之一,则将其评估为false时,将从DOM中删除该元素,并且即使稍后将其评估为true并显示该元素,您的单
NG Bootstrap 是基于 Angular(非 Angular.js)开发的 Bootstrap CSS 框架的指令集。 原生开发 专为Bootstrap 4 开发的Angular组件,开发了符合Angular生态系统的API,没有使用任何第三方Javascript库来实现,全都是纯粹的原生Javascript。 Boostrap的JS插件 支持全部Boostrap自带的Javascript
Mogwai ERDesigner NG是一个实体关系建模工具类似于ERWin。它设计成让数据库建模变得尽可能简易并为整个开发过程提供支持,从数据库设计到模式 (schema)和代码生成。此外ERDesigner还提供一个灵活的插件体系,从而可以通过安装新的插件来扩展该工具的功能。ERDesigner提 供的功能包括: *.能够使用一个强大和易于使用的图形编辑来设计数据库模型。 *.能够依据ER图
ng-inspector 是Chrome和Safari的浏览器扩展程序,它显示一个检查器面板,该面板实时显示当前页面中的AngularJS作用域层次结构,以及哪些控制器或指令与哪个作用域相关联。 将鼠标悬停在检查器中的范围上将突出显示该范围附加到的DOM元素。单击模型将console.log该模型的内容。 该扩展程序在带有AngularJS徽标的地址栏旁边添加了一个按钮,用于打开和关闭窗格。
netsniff-ng 是一个高性能的Linux下基于命令行的网络包分析工具,与 tcpdump 和其他基于 libpcap 的包分析器不同的是,netsniff-ng 直接将输入的帧循环映射到接收缓冲区中,这样就可以直接在用户空间中进行方法,而无须在地址空间中复制。可用来调试本地网、测量性能和吞吐量,并生成相应的数据统计报表。
Highcharts-ng 是一个 AngularJS 的指令扩展,实现了在 AngularJS 应用中集成 Highcharts 图表库的功能。 演示地址:http://jsfiddle.net/pablojim/46rhz/ 使用方法: var myapp = angular.module('myapp', ["highcharts-ng"]); HTML: <highchart id="ch