2017-02-09 8 views
6

मैंने अपलोड के दौरान पृष्ठ छोड़ने से बचने के लिए CanDeactivate गार्ड लागू किया है और यह काम करता है। समस्या यह है कि मेरा संदेश हमेशा एक डिफ़ॉल्ट संदेश होता है (ब्राउज़र भाषा की वजह से डच में) और यहां तक ​​कि एक संदेश भी सेट करना, फिर भी एक ही डिफ़ॉल्ट confirm विंडो दिखाएं। मैं अपना खुद का संदेश लिखना चाहता हूं (वास्तव में मेरे पास एक मॉडल है जिसे मैं दिखाना चाहता हूं, लेकिन पहले मैं अपने सरल संदेश के साथ काम करना चाहता हूं)संदेश की पुष्टि कर सकते हैं

कोई विचार क्या हो सकता है? क्या मैं कुछ भूल रहा हूँ? अग्रिम धन्यवाद!

यहाँ कोड

गार्ड है।

import { Injectable, ViewContainerRef } from '@angular/core'; 
    import { CanDeactivate } from '@angular/router'; 
    import { Observable } from 'rxjs/Observable'; 
    import { DialogService } from '../services'; 

    export interface PendingUpload { 
     canDeactivate:() => boolean | Observable<boolean>; 
    } 
    @Injectable() 
    export class PendingUploadGuard implements CanDeactivate<PendingUpload> { 
     constructor(private dialogService: DialogService, private viewContainerRef: ViewContainerRef) { } 

     canDeactivate(component: PendingUpload): boolean | Observable<boolean> { 

      return component.canDeactivate() 
       ? true 
       : confirm("Test custom message"); 

       //dialog I want to use later 
       //this.dialogService.confirm("modal title", "modal body", this.viewContainerRef);     
     } 
    } 

घटक

import { Component, OnInit, HostListener } from '@angular/core'; 

import { Observable } from 'rxjs/Observable'; 

import { PendingUpload } from '../../shared/validators/pending-upload.guard'; 

import './../../rxjs-operators'; 

@Component({ 
    selector: 'component-selector', 
    templateUrl: './html', 
    styleUrls: ['./css'] 
}) 
export class ScannerUploadComponent implements OnInit, PendingUpload { 
    uploading: boolean = false; 

    constructor() { } 

    ngOnInit() { 
     this.uploading = false; 
    } 

    @HostListener('window:beforeunload') 
    canDeactivate(): Observable<boolean> | boolean { 
     return !this.uploading; 
    } 
} 
+0

एल्मर ने इस प्रश्न के लिए एंडर्स को यहां पाया: [कोणीय 2 - पृष्ठ छोड़ने से पहले सहेजे गए परिवर्तनों के उपयोगकर्ता को चेतावनी दें] (http://stackoverflow.com/questions/35922071/angular-2-warn-user-of-unsaved- परिवर्तन-पहले-छोड़ने वाले पृष्ठ /) –

+0

मैंने इसे देखा है और अभी भी मुझे अपने कस्टम संदेश के बजाय एक डिफ़ॉल्ट संदेश पाठ (डच में) देता है .... मैं कोणीय दस्तावेज़ों और कार्यों से विशिष्ट गार्ड का उपयोग करता हूं लेकिन एक बग है जैसे [यह] (https://github.com/angular/angular/issues/10321) ..मैं इस काम को करने के लिए संघर्ष कर रहा हूं लेकिन अब तक कोई सफलता नहीं है। –

उत्तर

7

जब रहे (उदा http://localhost:4200/#/test1 से http://localhost:4200/#/test2 है, वहाँ नेविगेट) कहीं अपने कोणीय एप्लिकेशन के भीतर नेविगेट करने की कोशिश कर अपने कस्टम संदेश केवल दिखाया जाएगा। ऐसा इसलिए है क्योंकि CanDeactivate गार्ड केवल आपके कोणीय ऐप के भीतर कोणीय राउटर के माध्यम से किए गए रूट परिवर्तनों के लिए सक्रिय करता है।

जब आपके कोणीय एप्लिकेशन से दूर नेविगेट (जैसे, http://localhost:4200/#/test1 से http://stackoverflow.com पर जाकर, पेज ताज़ा, ब्राउज़र विंडो/टैब, आदि बंद करने), windowbeforeunload घटना (@HostListener('window:beforeunload') एनोटेशन के कारण) को सक्रिय करता है और CanDeactivate गार्ड के बिना, अपने आप पर confirm संवाद को संभालता है। इस मामले में, क्रोम और फ़ायरफ़ॉक्स अपने स्वयं के लंबित परिवर्तन चेतावनी संदेश प्रदर्शित करते हैं।

आप beforeunload ईवेंट और यह कैसे काम करता है here के बारे में और अधिक पढ़ सकते हैं। आप "नोट्स" खंड में ध्यान देंगे कि यह निम्नलिखित राज्यों:

फ़ायरफ़ॉक्स 4 में और बाद में लौटे स्ट्रिंग उपयोगकर्ता को प्रदर्शित नहीं है। इसके बजाए, फ़ायरफ़ॉक्स स्ट्रिंग को प्रदर्शित करता है "यह पृष्ठ आपको यह पुष्टि करने के लिए कह रहा है कि आप छोड़ना चाहते हैं - आपके द्वारा दर्ज किया गया डेटा सहेजा नहीं जा सकता है।"

क्रोम एक समान पैटर्न का पालन करता है, here समझाया गया।

आईई/एज अभी भी कस्टम beforeunload संदेश निर्दिष्ट करने की क्षमता प्रदान करने लगते हैं। इसका एक उदाहरण here देखा जा सकता है।

+0

उत्तर देने के लिए धन्यवाद, स्टू !! मैंने पहले से ही पहले से लोड किए गए ईवेंट के बारे में पढ़ा है और देखें कि इसका उपयोग करते समय संदेश को कस्टमाइज़ करना संभव नहीं है। मैंने सोचा कि मैं कुछ गलत कर रहा था क्योंकि आपके उत्तर में (आपके द्वारा पोस्ट किए गए लिंक से) इनमें से कोई भी इसका उल्लेख नहीं किया गया था ... मैं असंभव =] करने की कोशिश कर रहा था।कम से कम अब मुझे पता है कि मैं सही रास्ते पर था। एक बार फिर धन्यवाद। –

+0

@EmermerDantas - कोई समस्या नहीं है। मैंने अब इस भेद को बताने के लिए दूसरे प्रश्न के उत्तर को अपडेट कर दिया है। गलतफहमी के लिए खेद है। – stewdebaker

संबंधित मुद्दे