Angular2 在创建 ngSwitch 新视图后调用自定义函数
Angular2 calling custom function after ngSwitch new view is created
我正在使用 Angular2+Ionic2
创建一个小应用程序。在此应用程序中,当用户使用 ion-segment
切换到 map-segment
时,我希望将 google-map
初始化为 view segment
示例代码结构如下:
<ion-navbar *navbar class="hide-navbar">
<ion-segment [(ngModel)]="homeSegment">
<ion-segment-button value="list">
List..
</ion-segment-button>
<ion-segment-button value="map" >
Map
</ion-segment-button>
</ion-segment>
</ion-navbar>
<ion-content>
<div [ngSwitch]="homeSegment" >
<div *ngSwitchWhen="'map'">
<div id="googleMap"></div>
</div>
<ion-list *ngSwitchWhen="'list'">
Listing
</ion-list>
</div>
</ion-content>
我尝试过为 ion-segment-button
提供 click
监听器,但没有成功.在 div
与 id="googleMap"
附加到 DOM
之前,添加地图的功能被触发,结果是 undefined error
.
那么,当 ngSwitch
发生时,我们如何理解何时加载新元素?最好的方法是什么?
更新(添加js代码)
import {Page, NavController} from 'ionic-angular';
import {DataServiceManager} from '../../services/dataServicesManager';
@Page({
templateUrl: 'build/pages/listFob/listFob.html'
})
export class ListFob {
static get parameters(){
return [[NavController],[DataServiceManager]];
}
onPageWillEnter(){
this.fetchFobs();
}
ngOnInit(){
console.log("on init");
console.log(this.homeSegment);
}
ngAfterContentChecked() {
console.log("content checked")
}
constructor(nav, dataServiceManager){
this.nav = nav;
this.dataServiceManager = dataServiceManager;
this.homeSegment = "list";
}
loadMap(){
console.log(document.getElementById("googleMapAllFobs"));
// TODO: load map functionality
}
}
添加指令时出现错误消息
./app/directives/switch-segment.js
Module build failed: SyntaxError: /Users/Piccaza/ionic-projects/learning/fob/app/directives/switch-segment.js: Unexpected token (8:27)
6 | })
7 | export class SwitchSegment {
> 8 | @Output() switchSegment: EventEmitter = new EventEmitter();
| ^
9 | ngOnInit() {
10 | console.log("Directive triggered!");
11 | this.onCreate.emit('dummy');
at Parser.pp.raise (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:1378:13)
at Parser.pp.unexpected (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:2817:8)
at Parser.pp.expect (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:2811:33)
at Parser.pp.parseMethod (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:1091:8)
at Parser.pp.parseClassMethod (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:2495:8)
at Parser.pp.parseClassBody (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:2456:10)
at Parser.pp.parseClass (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:2339:8)
at Parser.pp.parseStatement (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:1813:19)
at Parser.pp.parseExportDeclaration (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:2578:15)
at Parser.pp.parseExport (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:2566:29)
@ ./app/pages/listFob/listFob.js 16:21-63 (CLI v2.0.0-beta.19)
Your system information:
Cordova CLI: Not installed
Ionic Version: 2.0.0-beta.3
Ionic CLI Version: 2.0.0-beta.19
Ionic App Lib Version: 2.0.0-beta.9
ios-deploy version: 1.8.5
ios-sim version: 5.0.6
OS: Mac OS X El Capitan
Node Version: v5.3.0
Xcode version: Xcode 7.2.1 Build version 7C1002
当 ngSwitch
adds/removes 个元素时没有内置调用函数的支持。
我会创建一个在创建时调用该函数的指令(例如在 ngOnInit()
中)或发出一个可以绑定事件处理程序的事件,并将其应用于添加的组件ngSwitch
分支已启用。
如果ngSwitch
添加了一个组件,您也可以在此组件中实现它(取决于您的要求)
更新
<ion-list (onCreate)="doSomething()" *ngSwitchCase="'list'">
Listing
</ion-list>
@Directive(selector: '[onCreate]')
export class OnCreate implements OnInit {
@Output() onCreate:EventEmitter = new EventEmitter();
ngOnInit() {
this.onCreate.emit('dummy');
}
}
最后我解决这个问题的方法是在 ion-segment element
上提供 (change)="onSegmentChanged($event)"
。
只要 ion-segment
将 switch
就会触发。当 dom element with id googleMapAllFobs
切换到 value="map"
时,我可以访问它。
提供了一个checking in onSegmentChanged
函数,在调用load google map
函数之前,确保当前视图包含[=36=]加载google 地图。
目前的要求看起来很容易。
你也可以在改变ion-segment时调用一个函数。
<ion-segment [(ngModel)]="homeSegment" (ionChange)="updatePage(homeSegment)">
在你的组件中有一个像
这样的函数
updatePage(homeSegment) {
if (homeSegment === 'map') {
this.loadMap();
}
}
也许这对某人有帮助。
我正在使用 Angular2+Ionic2
创建一个小应用程序。在此应用程序中,当用户使用 ion-segment
map-segment
时,我希望将 google-map
初始化为 view segment
示例代码结构如下:
<ion-navbar *navbar class="hide-navbar">
<ion-segment [(ngModel)]="homeSegment">
<ion-segment-button value="list">
List..
</ion-segment-button>
<ion-segment-button value="map" >
Map
</ion-segment-button>
</ion-segment>
</ion-navbar>
<ion-content>
<div [ngSwitch]="homeSegment" >
<div *ngSwitchWhen="'map'">
<div id="googleMap"></div>
</div>
<ion-list *ngSwitchWhen="'list'">
Listing
</ion-list>
</div>
</ion-content>
我尝试过为 ion-segment-button
提供 click
监听器,但没有成功.在 div
与 id="googleMap"
附加到 DOM
之前,添加地图的功能被触发,结果是 undefined error
.
那么,当 ngSwitch
发生时,我们如何理解何时加载新元素?最好的方法是什么?
更新(添加js代码)
import {Page, NavController} from 'ionic-angular';
import {DataServiceManager} from '../../services/dataServicesManager';
@Page({
templateUrl: 'build/pages/listFob/listFob.html'
})
export class ListFob {
static get parameters(){
return [[NavController],[DataServiceManager]];
}
onPageWillEnter(){
this.fetchFobs();
}
ngOnInit(){
console.log("on init");
console.log(this.homeSegment);
}
ngAfterContentChecked() {
console.log("content checked")
}
constructor(nav, dataServiceManager){
this.nav = nav;
this.dataServiceManager = dataServiceManager;
this.homeSegment = "list";
}
loadMap(){
console.log(document.getElementById("googleMapAllFobs"));
// TODO: load map functionality
}
}
添加指令时出现错误消息
./app/directives/switch-segment.js
Module build failed: SyntaxError: /Users/Piccaza/ionic-projects/learning/fob/app/directives/switch-segment.js: Unexpected token (8:27)
6 | })
7 | export class SwitchSegment {
> 8 | @Output() switchSegment: EventEmitter = new EventEmitter();
| ^
9 | ngOnInit() {
10 | console.log("Directive triggered!");
11 | this.onCreate.emit('dummy');
at Parser.pp.raise (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:1378:13)
at Parser.pp.unexpected (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:2817:8)
at Parser.pp.expect (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:2811:33)
at Parser.pp.parseMethod (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:1091:8)
at Parser.pp.parseClassMethod (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:2495:8)
at Parser.pp.parseClassBody (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:2456:10)
at Parser.pp.parseClass (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:2339:8)
at Parser.pp.parseStatement (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:1813:19)
at Parser.pp.parseExportDeclaration (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:2578:15)
at Parser.pp.parseExport (/Users/Piccaza/ionic-projects/learning/fob/node_modules/babylon/index.js:2566:29)
@ ./app/pages/listFob/listFob.js 16:21-63 (CLI v2.0.0-beta.19)
Your system information:
Cordova CLI: Not installed
Ionic Version: 2.0.0-beta.3
Ionic CLI Version: 2.0.0-beta.19
Ionic App Lib Version: 2.0.0-beta.9
ios-deploy version: 1.8.5
ios-sim version: 5.0.6
OS: Mac OS X El Capitan
Node Version: v5.3.0
Xcode version: Xcode 7.2.1 Build version 7C1002
当 ngSwitch
adds/removes 个元素时没有内置调用函数的支持。
我会创建一个在创建时调用该函数的指令(例如在 ngOnInit()
中)或发出一个可以绑定事件处理程序的事件,并将其应用于添加的组件ngSwitch
分支已启用。
如果ngSwitch
添加了一个组件,您也可以在此组件中实现它(取决于您的要求)
更新
<ion-list (onCreate)="doSomething()" *ngSwitchCase="'list'">
Listing
</ion-list>
@Directive(selector: '[onCreate]')
export class OnCreate implements OnInit {
@Output() onCreate:EventEmitter = new EventEmitter();
ngOnInit() {
this.onCreate.emit('dummy');
}
}
最后我解决这个问题的方法是在 ion-segment element
上提供 (change)="onSegmentChanged($event)"
。
只要 ion-segment
将 switch
就会触发。当 dom element with id googleMapAllFobs
切换到 value="map"
时,我可以访问它。
提供了一个checking in onSegmentChanged
函数,在调用load google map
函数之前,确保当前视图包含[=36=]加载google 地图。
目前的要求看起来很容易。
你也可以在改变ion-segment时调用一个函数。
<ion-segment [(ngModel)]="homeSegment" (ionChange)="updatePage(homeSegment)">
在你的组件中有一个像
这样的函数updatePage(homeSegment) {
if (homeSegment === 'map') {
this.loadMap();
}
}
也许这对某人有帮助。