অ্যাংুলারজেএস ইউআই-রাউটার স্টেট মেশিনের সাথে কাজ করার জন্য আমি কীভাবে পিছনে বাটন পেতে পারি?


87

আমি ইউআই-রাউটার ব্যবহার করে একটি কৌণিক একক পৃষ্ঠার অ্যাপ্লিকেশন প্রয়োগ করেছি ।

মূলত আমি প্রতিটি রাজ্যকে আলাদা আলাদা ইউআরএল ব্যবহার করে সনাক্ত করেছি তবে এটি বন্ধুত্বপূর্ণ, জিইউডি প্যাক করা ইউআরএল জন্য তৈরি করা হয়েছে।

সুতরাং আমি এখন আমার সাইটটিকে একটি আরও সাধারণ রাষ্ট্র-মেশিন হিসাবে সংজ্ঞায়িত করেছি। রাজ্যগুলি ইউআরএল দ্বারা চিহ্নিত করা হয় না তবে কেবল প্রয়োজন অনুসারে স্থানান্তরিত হয়:

নেস্টেড স্টেটস সংজ্ঞায়িত করুন

angular
.module 'app', ['ui.router']
.config ($stateProvider) ->
    $stateProvider
    .state 'main', 
        templateUrl: 'main.html'
        controller: 'mainCtrl'
        params: ['locationId']

    .state 'folder', 
        templateUrl: 'folder.html'
        parent: 'main'
        controller: 'folderCtrl'
        resolve:
            folder:(apiService) -> apiService.get '#base/folder/#locationId'

একটি সংজ্ঞায়িত রাজ্যে রূপান্তর

#The ui-sref attrib transitions to the 'folder' state

a(ui-sref="folder({locationId:'{{folder.Id}}'})")
    | {{ folder.Name }}

এই সিস্টেমটি খুব ভালভাবে কাজ করে এবং আমি এর পরিষ্কার বাক্য গঠন পছন্দ করি। তবে, আমি ইউআরএলগুলি ব্যবহার করছি না বলে পিছনের বোতামটি কাজ করে না।

আমি কীভাবে আমার ঝরঝরে ইউআই-রাউটারের স্টেট-মেশিন রাখব তবে পিছনের বোতামটির কার্যকারিতা সক্ষম করব?


4
"রাজ্যগুলি ইউআরএল দ্বারা চিহ্নিত করা যায় না" - এবং আপনার সন্দেহ আছে এমন সমস্যা আছে। পিছনের বোতামটি কোড থেকে বেশ সুরক্ষিত (অন্যথায় লোকেরা এটিকে ওভাররাইড করবে, সমস্যা তৈরি করবে)। কেন কেবল কৌণিককে আরও ভাল ইউআরএল তৈরি করা যাক না, যেমন (ওকে তারা কৌণিক ব্যবহার নাও করতে পারে, তবে তাদের ইউআরএল স্কীম চিত্রণযোগ্য)?
jcollum

এছাড়াও, এই প্রশ্নের সাহায্য করতে পারেন: stackoverflow.com/questions/13499040/...
jcollum

এছাড়াও, যেহেতু আপনি ইউআরএলগুলি ব্যবহার করছেন না তার অর্থ এই নয় যে জেড রাজ্যে যাওয়ার জন্য লোকেরা এটিতে পৌঁছানোর জন্য রাষ্ট্রের এক্স এবং ওয়াইয়ের মাধ্যমে ক্লিক করতে হবে? এটি বিরক্তিকর হতে পারে।
jcollum

এটি কি বিভিন্ন প্যারামের সাথে রাষ্ট্রের সাথে যাবে? @ জ্যাকলুম
বিজয়বিষ্ণু

আমার কোনও ধারণা নেই, এটি অনেক আগে ছিল
jcollum

উত্তর:


78

বিঃদ্রঃ

যে $window.history.back()সমস্ত পরিবর্তনের ব্যবহারের পরামর্শ দেয় তার উত্তরগুলি এই প্রশ্নের একটি গুরুত্বপূর্ণ অংশকে হারিয়ে ফেলেছে: ইতিহাসের উত্থানের সাথে সাথে (পিছনে / এগিয়ে / রিফ্রেশ করুন) অ্যাপ্লিকেশনের অবস্থাটি কীভাবে সঠিক স্থিতিতে ফিরিয়ে আনতে হবে । সেটা মাথায় রেখে; দয়া করে, পড়ুন।


হ্যাঁ, ব্রাউজারটি ফিরে / ফরোয়ার্ড (ইতিহাস) পাওয়া এবং খাঁটি ui-routerস্টেট-মেশিন চালিত করে রিফ্রেশ করা সম্ভব তবে এতে কিছুটা সময় লাগে।

আপনার কয়েকটি উপাদান প্রয়োজন:

  • অনন্য ইউআরএল । আপনি url পরিবর্তন করার সময় ব্রাউজারটি কেবল পিছনে / ফরোয়ার্ড বোতামগুলিকে সক্ষম করে so এই ইউআরএলগুলিতে যদিও কোনও রাজ্যের তথ্য থাকা দরকার না।

  • একটি সেশন পরিষেবা । প্রতিটি উত্পন্ন ইউআরএল একটি নির্দিষ্ট রাজ্যের সাথে সম্পর্কিত হয় তাই আপনার ইউআরএল-রাষ্ট্র জোড়াগুলি সংরক্ষণ করার জন্য আপনার একটি উপায় প্রয়োজন যাতে আপনার কৌনিক অ্যাপটি ফিরে / ফরোয়ার্ড বা রিফ্রেশ ক্লিকগুলি পুনরায় চালু করার পরে আপনি রাষ্ট্রের তথ্য পুনরুদ্ধার করতে পারেন।

  • একটি রাষ্ট্র ইতিহাস । ইউআই-রাউটারের একটি সাধারণ অভিধান অনন্য ইউআরএল দ্বারা চালিত। আপনি যদি এইচটিএমএল 5 এর উপর নির্ভর করতে পারেন তবে আপনি এইচটিএমএল 5 ইতিহাস এপিআই ব্যবহার করতে পারেন , তবে যদি আমার মতো আপনিও কোড কোডের কয়েকটি লাইনে নিজেকে এটি প্রয়োগ করতে পারেন না (নীচে দেখুন)।

  • একটি অবস্থান পরিষেবা । অবশেষে, আপনার কোড দ্বারা অভ্যন্তরীণভাবে ট্রিগার হওয়া, এবং সাধারণ ব্রাউজারের ইউআরএল পরিবর্তনগুলি সাধারণত ব্রাউজার বোতামে ক্লিক করে বা ব্রাউজার বারে স্টাফ টাইপ করে ব্যবহারকারী দ্বারা চালিত সাধারণ ব্রাউজারের ইউআরএল পরিবর্তন করতে আপনাকে সক্ষম হতে হবে। এগুলি কিছুটা জটিল হয়ে উঠতে পারে কারণ কী কী ঘটায় তা নিয়ে বিভ্রান্ত হওয়া সহজ।

এই প্রয়োজনীয়তার প্রতিটি আমার বাস্তবায়ন এখানে। আমি তিনটি পরিষেবাতে সবকিছুকে বান্ডিল করেছি:

সেশন পরিষেবা

class SessionService

    setStorage:(key, value) ->
        json =  if value is undefined then null else JSON.stringify value
        sessionStorage.setItem key, json

    getStorage:(key)->
        JSON.parse sessionStorage.getItem key

    clear: ->
        @setStorage(key, null) for key of sessionStorage

    stateHistory:(value=null) ->
        @accessor 'stateHistory', value

    # other properties goes here

    accessor:(name, value)->
        return @getStorage name unless value?
        @setStorage name, value

angular
.module 'app.Services'
.service 'sessionService', SessionService

এটি জাভাস্ক্রিপ্ট sessionStorageঅবজেক্টের জন্য একটি মোড়ক । আমি এখানে স্পষ্টতার জন্য এটি কেটে ফেলেছি। এর সম্পূর্ণ ব্যাখ্যার জন্য দয়া করে দেখুন: আমি কীভাবে একটি AngularJS একক পৃষ্ঠা অ্যাপ্লিকেশন সহ পৃষ্ঠা সতেজ হ্যান্ডেল করব

রাজ্য ইতিহাস পরিষেবা

class StateHistoryService
    @$inject:['sessionService']
    constructor:(@sessionService) ->

    set:(key, state)->
        history = @sessionService.stateHistory() ? {}
        history[key] = state
        @sessionService.stateHistory history

    get:(key)->
        @sessionService.stateHistory()?[key]

angular
.module 'app.Services'
.service 'stateHistoryService', StateHistoryService

StateHistoryServiceস্টোরেজ ও উত্পন্ন, অনন্য URL- এর মাধ্যমে অস্থির ঐতিহাসিক রাজ্যের আহরণ পর সৌন্দর্য। অভিধানের স্টাইলের অবজেক্টের জন্য এটি কেবলমাত্র একটি সুবিধাযুক্ত মোড়ক।

রাজ্য অবস্থান পরিষেবা

class StateLocationService
    preventCall:[]
    @$inject:['$location','$state', 'stateHistoryService']
    constructor:(@location, @state, @stateHistoryService) ->

    locationChange: ->
        return if @preventCall.pop('locationChange')?
        entry = @stateHistoryService.get @location.url()
        return unless entry?
        @preventCall.push 'stateChange'
        @state.go entry.name, entry.params, {location:false}

    stateChange: ->
        return if @preventCall.pop('stateChange')?
        entry = {name: @state.current.name, params: @state.params}
        #generate your site specific, unique url here
        url = "/#{@state.params.subscriptionUrl}/#{Math.guid().substr(0,8)}"
        @stateHistoryService.set url, entry
        @preventCall.push 'locationChange'
        @location.url url

angular
.module 'app.Services'
.service 'stateLocationService', StateLocationService

StateLocationServiceদুটি ঘটনার হ্যান্ডলগুলি:

  • locationChange । ব্রাউজারগুলির অবস্থান পরিবর্তন করা হয়, সাধারণত যখন পিছনে / ফরোয়ার্ড / রিফ্রেশ বোতাম টিপানো হয় বা অ্যাপ্লিকেশনটি প্রথম শুরু করা হয় বা যখন কোনও ইউআরএল-এ টাইপ করা হয় তখন এটিকে বলা হয়। বর্তমান location.url জন্য অবস্থায় উপস্থিত থাকলে StateHistoryServiceতারপর এটি নামঃ ui-রাউটার এর মাধ্যমে রাষ্ট্র পুনঃস্থাপন করতে ব্যবহৃত হয় $state.go

  • stateChange । আপনি যখন অভ্যন্তরীণভাবে রাষ্ট্রের দিকে চলে যান তখন এটিকে বলা হয়। বর্তমান রাষ্ট্রের নাম এবং প্যারামগুলি StateHistoryServiceউত্পন্ন url দ্বারা কী দ্বারা সংরক্ষণ করা হয় । এই উত্পন্ন ইউআরএল আপনি যা চান তা হতে পারে, এটি মানুষের পাঠযোগ্য উপায়ে রাষ্ট্রটিকে সনাক্ত করতে পারে বা নাও পারে। আমার ক্ষেত্রে আমি একটি স্টেট প্যারাম প্লাস এবং একটি গাইড থেকে প্রাপ্ত এলোমেলোভাবে অঙ্কিত অঙ্কের ক্রম ব্যবহার করছি (গাইড জেনারেটরের স্নিপেটের জন্য পাদদেশ দেখুন)। উত্পাদিত ইউআরএল ব্রাউজার বারে প্রদর্শিত হয় এবং গুরুত্বপূর্ণভাবে ব্রাউজারের অভ্যন্তরীণ ইতিহাসের স্ট্যাক ব্যবহার করে যুক্ত হয় @location.url url। এটি ব্রাউজারের ইতিহাস স্ট্যাকটিতে url যুক্ত করে যা সামনের / পিছনের বোতামগুলিকে সক্ষম করে।

এই কৌশল নিয়ে বড় সমস্যা যে কলিং হয় @location.url urlমধ্যে stateChangeপদ্ধতি আরম্ভ হবে $locationChangeSuccessইভেন্ট এবং তাই কল locationChangeপদ্ধতি। সমানভাবে কলিং @state.goথেকে locationChangeআরম্ভ হবে $stateChangeSuccessঘটনা এবং তাই stateChangeপদ্ধতি। এটি খুব বিভ্রান্তিকর হয়ে ওঠে এবং ব্রাউজারের ইতিহাসের শেষ নেই।

সমাধান খুব সহজ। আপনি preventCallঅ্যারেটিকে স্ট্যাক ( popএবং push) হিসাবে ব্যবহৃত হচ্ছে দেখতে পারেন । প্রতিবার যে কোনও একটি পদ্ধতিকে বলা হয় এটি অন্য পদ্ধতিটিকে কেবলমাত্র এককালীন বলা হচ্ছে তা প্রতিরোধ করে। এই কৌশলটি $ ইভেন্টগুলির সঠিক ট্রিগারটিতে বাধা দেয় না এবং সবকিছু সোজা রাখে।

এখন আমাদের যা করতে হবে তা হ'ল HistoryServiceরাষ্ট্রের রূপান্তর জীবন-চক্রের উপযুক্ত সময়ে পদ্ধতিগুলি কল করা । এটি AngularJS অ্যাপ্লিকেশন .runপদ্ধতিতে এইভাবে করা হয় :

কৌণিক অ্যাপ.আরুন

angular
.module 'app', ['ui.router']
.run ($rootScope, stateLocationService) ->

    $rootScope.$on '$stateChangeSuccess', (event, toState, toParams) ->
        stateLocationService.stateChange()

    $rootScope.$on '$locationChangeSuccess', ->
        stateLocationService.locationChange()

একটি গাইড জেনারেট করুন

Math.guid = ->
    s4 = -> Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1)
    "#{s4()}#{s4()}-#{s4()}-#{s4()}-#{s4()}-#{s4()}#{s4()}#{s4()}"

এই সব জায়গায়, ফরোয়ার্ড / পিছনে বোতাম এবং রিফ্রেশ বোতাম সমস্ত প্রত্যাশা অনুযায়ী কাজ করে।


4
উপরে SessionService উদাহরণে, আমি মনে করি অ্যাকসেসর: পদ্ধতি ব্যবহার করা উচিত @setStorageএবং @getStorageবরং `@ পেতে / setSession 'ছাড়া।
পিটার হুইটফিল্ড

4
উদাহরণস্বরূপ কোন ভাষা ব্যবহৃত হয়। কৌনিক বলে মনে হচ্ছে না যার সাথে আমি পরিচিত।
দীপক

ভাষাটি জাভাস্ক্রিপ্ট ছিল, বাক্য গঠনটি ছিল কফিসক্রিপ্ট।
বায়োফ্র্যাক্টাল

4
@jlguenego আপনার ফাংশনাল ব্রাউজারের ইতিহাস / বোজারের পিছনে এবং পিছনের বোতাম এবং ইউআরএল রয়েছে যা আপনি বুকমার্ক করতে পারেন।
টর্স্টেন বারথেল

4
@ জ্লগুয়েনেগো - যে উত্তরগুলি বিভিন্নতা ব্যবহারের পরামর্শ দেয় $window.history.back()সেগুলি প্রশ্নের একটি গুরুত্বপূর্ণ অংশ মিস করেছে। পয়েন্টটি হ'ল ইতিহাসটি লাফিয়ে উঠার সাথে সাথে (পিছনে / ফরোয়ার্ড / রিফ্রেশ) যথাযথ রাজ্য-অবস্থানে অ্যাপ্লিকেশনের অবস্থা পুনরুদ্ধার করা । এটি সাধারণত ইউআরআইয়ের মাধ্যমে রাজ্যের ডেটা সরবরাহ করে অর্জন করা যেতে পারে। (স্পষ্ট) ইউআরআই রাষ্ট্রের ডেটা ছাড়াই রাষ্ট্র-অবস্থানগুলির মধ্যে কীভাবে ঝাঁপিয়ে পড়তে হবে তা প্রশ্নে প্রশ্ন করা হয়েছিল । এই সীমাবদ্ধতার পরিপ্রেক্ষিতে, কেবলমাত্র পিছনের বোতামটি প্রতিলিপি করা যথেষ্ট নয় কারণ এটি রাষ্ট্রের অবস্থান পুনরায় প্রতিষ্ঠিত করতে ইউআরআই রাষ্ট্রের ডেটা নির্ভর করে।
বায়োফ্র্যাক্টাল

46
app.run(['$window', '$rootScope', 
function ($window ,  $rootScope) {
  $rootScope.goBack = function(){
    $window.history.back();
  }
}]);

<a href="#" ng-click="goBack()">Back</a>

4
এটা খুবই পছন্দ করি! ... হ্যাঁ ... স্পষ্টতার $window.history.backজন্য যাদু করছেন না $rootScope... তাই আপনি চাইলে ফিরে যান আপনার নাবার বারের দিকনির্দেশনার সুযোগে আবদ্ধ হতে পারেন।
বেনিয়ামিন কনান্ট

@ বেনজামিন কনন্যান্ট যারা এটিকে কীভাবে বাস্তবায়ন করতে জানেন না তাদের জন্য, আপনি কেবল $window.history.back();একটি আহবান করার জন্য একটি ফাংশনটি রেখেছিলেন ng-click
চেকেডা

সঠিক rootScope শুধুমাত্র ফাংশন কোন টেমপ্লেটে অ্যাক্সেসযোগ্য করতে হয়
Guillaume, সার্বজনীনভাবে

চিকেন ডিনার
কোডি

23

বিভিন্ন প্রস্তাব পরীক্ষার পরে, আমি দেখতে পেলাম যে সবচেয়ে সহজতম উপায়টি প্রায়শই সেরা।

আপনি যদি কৌণিক ইউআই-রাউটার ব্যবহার করেন এবং সেরা দিকে ফিরে যেতে আপনার বোতামের দরকার হয় তা হ'ল:

<button onclick="history.back()">Back</button>

বা

<a onclick="history.back()>Back</a>

// সতর্কতা href সেট করবেন না বা পথটি নষ্ট হয়ে যাবে।

ব্যাখ্যা: ধরা যাক একটি স্ট্যান্ডার্ড ম্যানেজমেন্ট অ্যাপ্লিকেশন। অনুসন্ধান বস্তু -> দেখুন বস্তু -> বস্তু সম্পাদনা করুন

এই অবস্থা থেকে কৌণিক সমাধান ব্যবহার করে :

অনুসন্ধান -> দেখুন -> সম্পাদনা করুন

প্রতি :

অনুসন্ধান -> দেখুন

ঠিক এখন আমরা যা চাইছিলাম তা বাদ দিই যদি আপনি এখন ব্রাউজারের ব্যাক বোতামটি ক্লিক করেন তবে আপনি আবার থাকবেন:

অনুসন্ধান -> দেখুন -> সম্পাদনা করুন

এবং এটি যৌক্তিক নয়

তবে সহজ সমাধানটি ব্যবহার করে

<a onclick="history.back()"> Back </a>

থেকে:

অনুসন্ধান -> দেখুন -> সম্পাদনা করুন

বোতামে ক্লিক করার পরে:

অনুসন্ধান -> দেখুন

ব্রাউজারের ব্যাক বাটনে ক্লিক করার পরে:

অনুসন্ধান করুন

ধারাবাহিকতা সম্মানিত হয়। :-)


7

আপনি যদি সর্বাধিক সহজ "পিছনে" বোতামটি সন্ধান করেন তবে আপনি এর মতো একটি নির্দেশিকা সেট আপ করতে পারেন:

    .directive('back', function factory($window) {
      return {
        restrict   : 'E',
        replace    : true,
        transclude : true,
        templateUrl: 'wherever your template is located',
        link: function (scope, element, attrs) {
          scope.navBack = function() {
            $window.history.back();
          };
        }
      };
    });

মনে রাখবেন এটি মোটামুটি নির্বিঘ্নযুক্ত "ব্যাক" বোতাম কারণ এটি ব্রাউজারের ইতিহাস ব্যবহার করছে। যদি আপনি এটিকে আপনার অবতরণ পৃষ্ঠায় অন্তর্ভুক্ত করেন তবে এটি ব্যবহারকারীকে আপনার অবতরণ করার আগে থেকে যে কোনও ইউআরএল থেকে ফিরে এসেছিল।


3

ব্রাউজারের পিছনে / ফরোয়ার্ড বোতাম সমাধানটি
আমি একই সমস্যার মুখোমুখি হয়েছি এবং আমি এটি popstate event$ উইন্ডো অবজেক্ট এবং এর মাধ্যমে ব্যবহার করে সমাধান করেছি ui-router's $state object। সক্রিয় ইতিহাসের এন্ট্রি পরিবর্তন হওয়ার সাথে সাথে একটি পপস্টেট ইভেন্ট উইন্ডোতে প্রেরণ করা হয়। এবং ঘটনা ব্রাউজারের বোতাম ক্লিক আলোড়ন সৃষ্টি না যদিও এড্রেস বারে নতুন অবস্থান নির্দেশ করে থাকে। সুতরাং, অভিমানী আপনি রাজ্য থেকে নেভিগেট করে থাকেন করতে করতে আবার, যখন আপনি আঘাত ব্রাউজারে, আপনি ফিরে আসা উচিত
$stateChangeSuccess$locationChangeSuccess
mainfoldermainbackfolder রুট। পাথ আপডেট হয়েছে তবে দৃশ্যটি নেই এবং এখনও যা আছে তা প্রদর্শন করে main। এটা চেষ্টা কর:

angular
.module 'app', ['ui.router']
.run($state, $window) {

     $window.onpopstate = function(event) {

        var stateName = $state.current.name,
            pathname = $window.location.pathname.split('/')[1],
            routeParams = {};  // i.e.- $state.params

        console.log($state.current.name, pathname); // 'main', 'folder'

        if ($state.current.name.indexOf(pathname) === -1) {
            // Optionally set option.notify to false if you don't want 
            // to retrigger another $stateChangeStart event
            $state.go(
              $state.current.name, 
              routeParams,
              {reload:true, notify: false}
            );
        }
    };
}

এরপরে পিছনে / ফরোয়ার্ড বোতামগুলি সহজেই কাজ করা উচিত।

দ্রষ্টব্য: উইন্ডো.অনপপস্টেট () এর জন্য ব্রাউজারের সামঞ্জস্যতা পরীক্ষা করুন


3

একটি সরল নির্দেশিকা "গো-ব্যাক-ইতিহাস" ব্যবহার করে সমাধান করা যেতে পারে, এটি পূর্ববর্তী কোনও ইতিহাস না হলে উইন্ডোটি বন্ধ করে দিচ্ছে।

নির্দেশমূলক ব্যবহার

<a data-go-back-history>Previous State</a>

কৌণিক নির্দেশাবলী ঘোষণা

.directive('goBackHistory', ['$window', function ($window) {
    return {
        restrict: 'A',
        link: function (scope, elm, attrs) {
            elm.on('click', function ($event) {
                $event.stopPropagation();
                if ($window.history.length) {
                    $window.history.back();
                } else {
                    $window.close();  
                }
            });
        }
    };
}])

দ্রষ্টব্য: ইউআই-রাউটার ব্যবহার করে কাজ করা বা না।


0

পিছনের বোতামটিও আমার পক্ষে কাজ করছে না, তবে আমি বুঝতে পেরেছিলাম যে সমস্যাটি htmlআমার প্রধান পৃষ্ঠার ভিতরে, এর মধ্যে ছিলui-view উপাদানটিতে ছিল।

অর্থাত্

<div ui-view>
     <h1> Hey Kids! </h1>
     <!-- More content -->
</div>

সুতরাং আমি সামগ্রীটি একটি নতুন .htmlফাইলে স্থানান্তরিত করেছি এবং এটিতে টেমপ্লেট হিসাবে চিহ্নিত করেছি.js এবং রুটগুলি সহ ফাইলটিতে ।

অর্থাত্

   .state("parent.mystuff", {
        url: "/mystuff",
        controller: 'myStuffCtrl',
        templateUrl: "myStuff.html"
    })

-1

history.back()এবং পূর্ববর্তী অবস্থানে স্যুইচ করুন প্রায়শই আপনি চান তা কার্যকর করে না। উদাহরণস্বরূপ, যদি আপনার ট্যাবগুলির সাথে ফর্ম থাকে এবং প্রতিটি ট্যাবের নিজস্ব রাষ্ট্র থাকে তবে এটি কেবলমাত্র পূর্ববর্তী ট্যাবটি স্যুইচ করেছে, ফর্মটি থেকে ফিরে আসে না। যদি নেস্টেড স্টেটস থাকে তবে আপনার সাধারণত প্যারেন্ট স্টেটগুলির ডাইনি সম্পর্কে ভাবতে হবে যা আপনি রোলব্যাক করতে চান।

এই নির্দেশিকাটি সমস্যার সমাধান করে

angular.module('app', ['ui-router-back'])

<span ui-back='defaultState'> Go back </span>

এটি অবস্থায় ফিরে আসে, বোতামটি প্রদর্শিত হওয়ার আগে এটি সক্রিয় ছিল । .চ্ছিকdefaultState হ'ল রাষ্ট্রের নাম যা মেমরিতে কোনও পূর্ববর্তী অবস্থা নয়। এছাড়াও এটি স্ক্রোল অবস্থান পুনরুদ্ধার করে

কোড

class UiBackData {
    fromStateName: string;
    fromParams: any;
    fromStateScroll: number;
}

interface IRootScope1 extends ng.IScope {
    uiBackData: UiBackData;
}

class UiBackDirective implements ng.IDirective {
    uiBackDataSave: UiBackData;

    constructor(private $state: angular.ui.IStateService,
        private $rootScope: IRootScope1,
        private $timeout: ng.ITimeoutService) {
    }

    link: ng.IDirectiveLinkFn = (scope, element, attrs) => {
        this.uiBackDataSave = angular.copy(this.$rootScope.uiBackData);

        function parseStateRef(ref, current) {
            var preparsed = ref.match(/^\s*({[^}]*})\s*$/), parsed;
            if (preparsed) ref = current + '(' + preparsed[1] + ')';
            parsed = ref.replace(/\n/g, " ").match(/^([^(]+?)\s*(\((.*)\))?$/);
            if (!parsed || parsed.length !== 4)
                throw new Error("Invalid state ref '" + ref + "'");
            let paramExpr = parsed[3] || null;
            let copy = angular.copy(scope.$eval(paramExpr));
            return { state: parsed[1], paramExpr: copy };
        }

        element.on('click', (e) => {
            e.preventDefault();

            if (this.uiBackDataSave.fromStateName)
                this.$state.go(this.uiBackDataSave.fromStateName, this.uiBackDataSave.fromParams)
                    .then(state => {
                        // Override ui-router autoscroll 
                        this.$timeout(() => {
                            $(window).scrollTop(this.uiBackDataSave.fromStateScroll);
                        }, 500, false);
                    });
            else {
                var r = parseStateRef((<any>attrs).uiBack, this.$state.current);
                this.$state.go(r.state, r.paramExpr);
            }
        });
    };

    public static factory(): ng.IDirectiveFactory {
        const directive = ($state, $rootScope, $timeout) =>
            new UiBackDirective($state, $rootScope, $timeout);
        directive.$inject = ['$state', '$rootScope', '$timeout'];
        return directive;
    }
}

angular.module('ui-router-back')
    .directive('uiBack', UiBackDirective.factory())
    .run(['$rootScope',
        ($rootScope: IRootScope1) => {

            $rootScope.$on('$stateChangeSuccess',
                (event, toState, toParams, fromState, fromParams) => {
                    if ($rootScope.uiBackData == null)
                        $rootScope.uiBackData = new UiBackData();
                    $rootScope.uiBackData.fromStateName = fromState.name;
                    $rootScope.uiBackData.fromStateScroll = $(window).scrollTop();
                    $rootScope.uiBackData.fromParams = fromParams;
                });
        }]);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.