本文作者:文蔺 本文地址:http://www.wemlion.com/2016/javascript-weekly-306-notes/ 本文由 @文蔺 创作,转载请保留此声明。 所有权利保留,请勿用于商业目的。
$(document).ready
方法jQuery 3 中$(document).ready(handler)
等方法被 deprecated,仅保留 $(handler)
$('img').ready
这种方式,和 $(document).ready
没有任何区别
$(selector).ready(handler)
这种是低效的,且会造成不必要的误解
脚本放在 <body>
最底部的话,完全不需要 ready;
原生代码实现:
var callback = function ( ) { }; if ( document .readyState === "complete" || (document .readyState !== "loading" && !document .documentElement.doScroll) ) { callback(); } else { document .addEventListener("DOMContentLoaded" , callback); } document .attachEvent("onreadystatechange" , function ( ) { if (document .readyState === "complete" ){ document .detachEvent("onreadystatechange" , arguments .callee); } });
原文:Quick Tip: Replace jQuery’s Ready() with Plain JavaScript
Yarn vs NPM reactive ==> ReactiveFormsModule
template-driven ==> FormsModule
import { ReactiveFormsModule } from '@angular/forms';
import { FormControl, FormGroup, Validators } from '@angular/forms';
export class SignupFormComponent implements OnInit { user: FormGroup; constructor () {} ngOnInit() { this .user = new FormGroup({ name: new FormControl('' , [Validators.required, Validators.minLength(2 )]), account: new FormGroup({ email: new FormControl('' , Validators.required), confirm: new FormControl('' , Validators.required) }) }); } onSubmit({ value, valid }: { value : User, valid : boolean }) { console .log(value, valid); } }
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
@Component({...}) export class SignupFormComponent implements OnInit { user: FormGroup; constructor (private fb: FormBuilder) {} ngOnInit() { this .user = this .fb.group({ name: ['' , [Validators.required, Validators.minLength(2 )]], account: this .fb.group({ email: ['' , Validators.required], confirm: ['' , Validators.required] }) }); } onSubmit({ value, valid }: { value : User, valid : boolean }) { console .log(value, valid); } }
FormBuilder 和 FormControl 对比 ngOnInit() { this .user = new FormGroup({ name: new FormControl('' , [Validators.required, Validators.minLength(2 )]), account: new FormGroup({ email: new FormControl('' , Validators.required), confirm: new FormControl('' , Validators.required) }) }); } ngOnInit() { this .user = this .fb.group({ name: ['' , [Validators.required, Validators.minLength(2 )]], account: this .fb.group({ email: ['' , Validators.required], confirm: ['' , Validators.required] }) }); }
原文:Angular 2 form fundamentals: reactive forms
ES2016 Strict Mode 以下情况下,函数体内不能使用 "use strict"
: function doSomething (a, b=a ) { "use strict" ; } const doSomething = function ({a, b} ) { "use strict" ; }; const doSomething = (...a ) => { "use strict" ; };
the specification indicated that parameter lists should be parsed in the same mode as the function body (which means the “use strict” directive in the function body must trigger strict mode).
原文:The ECMAScript 2016 change you probably don’t know
Asynchronous Iteration 参见原文 Alternative 1: Communicating Sequential Processes (CSP), js-csp Alternative 2: Reactive Programming 原文:The ECMAScript 2016 change you probably don’t know
Angular 2 变化 其实我就看上了 Demo 中的两段代码,很有启发:
import {Component, NgModule, Input, trigger, state, animate, transition, style, HostListener } from '@angular/core' import {BrowserModule} from '@angular/platform-browser' import {Tooltip} from './tooltip.directive' ;@Component({ selector : 'toggle' , animations: [ trigger('toggle' , [ state('true' , style({ opacity : 1 ; color: 'red' })), state('void' , style({ opacity : 0 ; color: 'blue' })), transition(':enter' , animate('500ms ease-in-out' )), transition(':leave' , animate('500ms ease-in-out' )) ]) ], template: ` <div class="toggle" [@toggle]="show" *ngIf="show"> <ng-content></ng-content> </div>` }) export class Toggle { @Input() show:boolean = true ; @HostListener('document:click' ) onClick(){ this .show=!this .show; } } @Component({ selector: 'my-app' , template: ` <div> <div tooltip>Click to toggle animations</div> <h2>Hello {{name}}</h2> <toggle>Hey!</toggle> </div> ` ,}) export class App { name:string; constructor () { this .name = 'Angular 2.1' } } @NgModule({ imports: [ BrowserModule ], declarations: [ App, Toggle, Tooltip ], bootstrap: [ App ] }) export class AppModule {}
import {Directive, ElementRef, HostListener} from "@angular/core" ;@Directive({ selector: '[tooltip]' , host: { '[class.tooltip]' : "true" , } }) export class Tooltip { constructor (private div: ElementRef) { } @HostListener('document:mousemove' , ['$event' ]) mousemove(e: MouseEvent){ this .div.nativeElement.style.display = "block" ; this .div.nativeElement.style.top = e.pageY + 15 + "px" ; this .div.nativeElement.style.left = e.pageX + 10 + "px" ; } @HostListener('document:mouseout' , ['$event' ]) mouseout(e: MouseEvent){ var from = e.relatedTarget || e.toElement; if (!from || from .nodeName == "HTML" ) { this .div.nativeElement.style.display = "none" ; } } }
原文:Angular 2 — New features in Angular 2.1
编写自己的 .d.ts 写得挺详细,需要的时候可以参阅
原文:How to Create Your Own TypeScript Type Definition Files (.d.ts)
更多 see http://javascriptweekly.com/issues/306
本文作者:文蔺 本文地址:http://www.wemlion.com/2016/javascript-weekly-306-notes/ 转载请注明来源