【问题标题】:Angular2 calling custom function after ngSwitch new view is created创建ngSwitch新视图后Angular2调用自定义函数
【发布时间】:2017-06-21 19:10:01
【问题描述】:

我正在使用 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 侦听器,但没有成功。在将 divid="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 

【问题讨论】:

    标签: javascript google-maps angular ionic2


    【解决方案1】:

    ngSwitch 添加/删除元素时,不支持调用函数。

    我将创建一个指令,该指令在创建时调用该函数(例如在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');
      }
    }
    

    Plunker example

    【讨论】:

    • 我添加了一个答案,这似乎解决了我的问题。非常感谢您的所有意见。
    • 感谢@jsgoupil,看到您的更改迟到了自己接受。
    【解决方案2】:

    您也可以在离子段发生变化时调用函数。

    <ion-segment [(ngModel)]="homeSegment" (ionChange)="updatePage(homeSegment)">
    

    并且在你的组件中有一个类似的函数

    updatePage(homeSegment) {
      if (homeSegment === 'map') {
        this.loadMap();
      }
    }
    

    也许这对某人有帮助。

    【讨论】:

      【解决方案3】:

      最后,我通过在 ion-segment element 上提供 (change)="onSegmentChanged($event)" 来解决这个问题。

      只要ion-segment 将触发switch。当 dom element with id googleMapAllFobs 切换到 value="map" 时,我可以访问它。

      提供了一个检查onSegmentChanged函数,在调用load google map函数之前,确保当前视图包含div来加载谷歌地图。

      目前的要求看起来很简单。

      【讨论】:

      • 嗨,迪帕克。面临同样的任务,但不知道如何在onSegmentChanged 发生后取回对 DOM 元素的引用。你能分享一段代码吗?如何在onSegmentChanged 前后声明和访问元素?我使用@ViewChild 装饰器用地图捕捉 div,但在第一次事件出现后它是未定义的,因为 div 从 DOM 中删除...
      • 你能分享一下你是如何让它工作的吗..我试过但不能让它工作:(
      猜你喜欢
      • 1970-01-01
      • 2017-03-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      相关资源
      最近更新 更多