การเปลี่ยนเส้นทางไม่ได้เลื่อนไปด้านบนในหน้าใหม่


271

ฉันพบพฤติกรรมที่ไม่พึงประสงค์อย่างน้อยสำหรับฉันเมื่อเส้นทางเปลี่ยนไป ในขั้นตอนที่ 11 ของบทช่วยสอนhttp://angular.github.io/angular-phonecat/step-11/app/#/phones คุณสามารถดูรายการโทรศัพท์ หากคุณเลื่อนไปที่ด้านล่างและคลิกที่หนึ่งในล่าสุดคุณจะเห็นว่าการเลื่อนนั้นไม่ได้อยู่ที่ด้านบนแทนที่จะเป็นแบบกึ่งกลาง

ฉันพบสิ่งนี้ในหนึ่งในแอพของฉันด้วยและฉันก็สงสัยว่าฉันจะทำให้มันเลื่อนไปด้านบนได้อย่างไร ฉันสามารถทำได้ด้วยตนเอง แต่ฉันคิดว่าควรมีวิธีที่สง่างามในการทำสิ่งนี้ซึ่งฉันไม่รู้

ดังนั้นมีวิธีที่สวยงามเพื่อเลื่อนไปด้านบนเมื่อเส้นทางเปลี่ยน?

คำตอบ:


578

ปัญหาคือngViewของคุณยังคงตำแหน่งการเลื่อนเมื่อโหลดมุมมองใหม่ คุณสามารถแนะนำ$anchorScrollให้ "เลื่อนวิวพอร์ตหลังจากอัปเดตมุมมองแล้ว" ( เอกสารนั้นค่อนข้างคลุมเครือ แต่การเลื่อนที่นี่หมายถึงการเลื่อนไปที่ด้านบนของมุมมองใหม่)

ทางออกคือการเพิ่มautoscroll="true"องค์ประกอบ ngView ของคุณ:

<div class="ng-view" autoscroll="true"></div>

1
มันใช้งานได้สำหรับฉัน, หน้าเลื่อนไปด้านบน แต่ฉันใช้ scrollTo กับคำสั่ง smoothScroll, มีวิธีการทำ smoth scroll to top หรือไม่, นอกจากนี้โซลูชันของคุณเลื่อนไปด้านบนสุดของมุมมอง ด้านบนของหน้า?
xzegga

19
รัฐเอกสารถ้าแอตทริบิวต์ที่ถูกกำหนดโดยไม่คุ้มค่าให้เปิดใช้งานการเลื่อน ดังนั้นคุณสามารถย่อรหัสให้สั้นลง<div class="ng-view" autoscroll></div>และใช้งานได้เหมือนกัน (ยกเว้นกรณีที่คุณต้องการเลื่อนตามเงื่อนไข)
Daniel Liuzzi

7
มันไม่ทำงานสำหรับฉันหมอไม่ได้บอกว่ามันจะเลื่อนไปด้านบน
Pencilcheck

6
ฉันพบว่าถ้าการตั้งค่าอัตโนมัติเป็นจริงแล้วเมื่อผู้ใช้ 'ย้อนกลับ' พวกเขากลับไปที่ด้านบนของหน้าไม่ใช่ที่พวกเขาทิ้งไว้ซึ่งเป็นพฤติกรรมที่ไม่พึงประสงค์
axzr

4
สิ่งนี้จะเลื่อนมุมมองของคุณไปที่ div นี้ ดังนั้นมันจะเลื่อนไปที่ด้านบนของหน้าหากมันเกิดขึ้นที่ด้านบนของหน้า มิฉะนั้นคุณจะต้องทำงาน$window.scrollTo(0,0)ในฟังรายการเหตุการณ์ของ $ stateChangeSuccess
Filip Sobczak

46

เพียงแค่ใส่รหัสนี้เพื่อเรียกใช้

$rootScope.$on("$routeChangeSuccess", function (event, currentRoute, previousRoute) {

    window.scrollTo(0, 0);

});

6
$window.scrollTop(0,0)ทำงานได้ดีขึ้นสำหรับฉันกว่าอัตโนมัติ ในกรณีของฉันฉันมีมุมมองที่เข้าและออกด้วยการเปลี่ยน
IsidroGH

1
นอกจากนี้ยังใช้งานได้ดีสำหรับฉันกว่า autoscroll = "true" Autoscroll ช้าเกินไปด้วยเหตุผลบางอย่างมันจะเลื่อนไปด้านบนหลังจากมุมมองใหม่มองเห็นได้แล้ว
เกรกอรี่ Bolkenstijn

5
สิ่งนี้ทำงานได้ดีที่สุดสำหรับฉัน: $ rootScope $ on ('$ stateChangeSuccess', function () {$ ("html, body"). animate ({scrollTop: 0}, 200);});
James Gentes

$ window.scrollTop ควรเป็น $ window.scrollTo มิฉะนั้นจะบอกว่าไม่มีอยู่ วิธีนี้ใช้งานได้ดี!
ผู้เผยพระวจนะด้านซอฟต์แวร์

@ JamesGentes ฉันต้องการสิ่งนี้เช่นกัน ขอบคุณ
Mackenzie Browne

36

รหัสนี้ใช้งานได้ดีสำหรับฉัน .. ฉันหวังว่ามันจะทำงานได้ดีสำหรับคุณ .. สิ่งที่คุณต้องทำก็แค่ฉีด $ anchorScroll กับ run block ของคุณและใช้ฟังก์ชั่น listener กับ rootScope เหมือนที่ฉันทำในตัวอย่างด้านล่าง ..

 angular.module('myAngularApp')
.run(function($rootScope, Auth, $state, $anchorScroll){
    $rootScope.$on("$locationChangeSuccess", function(){
        $anchorScroll();
    });

นี่คือลำดับการเรียกของโมดูล Angularjs:

  1. app.config()
  2. app.run()
  3. directive's compile functions (if they are found in the dom)
  4. app.controller()
  5. directive's link functions (again, if found)

RUN BLOCK ถูกเรียกใช้งานหลังจากสร้างหัวฉีดและใช้เพื่อเริ่มต้นแอปพลิเคชัน .. ซึ่งหมายความว่าเมื่อคุณเปลี่ยนเส้นทางไปยังมุมมองเส้นทางใหม่ผู้ฟังในบล็อกที่เรียกใช้จะเรียก

$ anchorScroll ()

และตอนนี้คุณสามารถเห็นการเลื่อนเริ่มขึ้นไปด้านบนด้วยมุมมองที่กำหนดเส้นทางใหม่ :)


ในที่สุดการแก้ปัญหาที่ทำงานกับหัวเหนียว! ขอบคุณ!
ฟาบิโอ

31

หลังจากที่หนึ่งหรือสองชั่วโมงของการพยายามทุกชุดของui-view autoscroll=true, $stateChangeStart, $locationChangeStart, $uiViewScrollProvider.useAnchorScroll(),$provide('$uiViewScroll', ...)และอื่น ๆ อีกมากมายที่ฉันไม่สามารถได้รับการเลื่อนไปด้านบน-on-ใหม่หน้าในการทำงานตามที่คาดไว้

นี่คือสิ่งที่ได้ผลสำหรับฉันในที่สุด มันจับ pushState และ replaceState และอัปเดตเฉพาะตำแหน่งเลื่อนเมื่อหน้าใหม่ถูกนำทางไปยัง (ปุ่มย้อนกลับ / ไปข้างหน้ารักษาตำแหน่งเลื่อนของพวกเขา):

.run(function($anchorScroll, $window) {
  // hack to scroll to top when navigating to new URLS but not back/forward
  var wrap = function(method) {
    var orig = $window.window.history[method];
    $window.window.history[method] = function() {
      var retval = orig.apply(this, Array.prototype.slice.call(arguments));
      $anchorScroll();
      return retval;
    };
  };
  wrap('pushState');
  wrap('replaceState');
})

มันใช้งานได้ดีสำหรับกรณีการใช้งานของฉัน ฉันใช้ Angular UI-Router กับมุมมองแบบซ้อน (หลายระดับลึก) ขอบคุณ!
Joshua Powell

FYI - คุณจะต้องอยู่ในโหมด HTML5 เป็นเหลี่ยมเพื่อใช้ pushState: $locationProvider.html5Mode(true); @wkronkel มีวิธีที่จะทำให้สำเร็จเมื่อไม่ได้ใช้โหมด HTML5 ในเชิงมุมหรือไม่? การโหลดหน้าสาเหตุทำให้เกิดข้อผิดพลาด 404 อันเนื่องจากโหมด html 5 กำลังทำงานอยู่
britztopher

@britztopher คุณสามารถเชื่อมต่อกับเหตุการณ์ในตัวและรักษาประวัติของคุณเองใช่ไหม
Casey

2
คุณจะผนวกสิ่งนี้.runไว้ที่ใด appวัตถุเชิงมุมของคุณ?
Philll_t

1
@Philll_t: ใช่runฟังก์ชั่นเป็นวิธีการที่มีอยู่ในทุกวัตถุโมดูลเชิงมุม
Hinrich

18

นี่คือวิธีแก้ปัญหาที่รัดกุมสมบูรณ์และค่อนข้างยุติธรรม มันใช้สไตล์ที่เข้ากันได้ minification (และการเข้าถึง angular.module (NAME) เพื่อโมดูลของคุณ)

angular.module('yourModuleName').run(["$rootScope", "$anchorScroll" , function ($rootScope, $anchorScroll) {
    $rootScope.$on("$locationChangeSuccess", function() {
                $anchorScroll();
    });
}]);

ป.ล. ฉันพบว่าสิ่งที่หมุนอัตโนมัติไม่มีผลไม่ว่าจะตั้งค่าเป็นจริงหรือเท็จ


1
อืมมม .. นี่เป็นการเลื่อนมุมมองไปด้านบนก่อนจากนั้นมุมมองจะเปลี่ยนบนหน้าจอสำหรับฉัน
Strelok

วิธีแก้ปัญหาที่สะอาดฉันกำลังมองหา หากคุณคลิก "ย้อนกลับ" มันจะนำคุณไปยังที่ที่คุณค้างไว้ - นี่อาจไม่เป็นที่ต้องการสำหรับบางคน แต่ฉันชอบมันในกรณีของฉัน
mjoyce91

15

ใช้ angularjs UI Router สิ่งที่ฉันทำคือ:

    .state('myState', {
        url: '/myState',
        templateUrl: 'app/views/myState.html',
        onEnter: scrollContent
    })

ด้วย:

var scrollContent = function() {
    // Your favorite scroll method here
};

มันไม่เคยล้มเหลวในหน้าใด ๆ และมันไม่ใช่ทั่วโลก


1
ความคิดที่ยอดเยี่ยมคุณสามารถทำให้การใช้งานสั้นลงได้:onEnter: scrollContent
zucker

2
คุณใส่อะไรในที่ที่คุณเขียน// Your favorite scroll method here?
ตัวแทน Zebra

4
ช่วงเวลาที่ดี: ฉันอยู่เหนือความคิดเห็นสองบรรทัดในรหัสต้นฉบับพยายาม UI เตอร์ชื่อ ฉันใช้ $('html, body').animate({ scrollTop: -10000 }, 100);
Léon Pelletier

1
ฮ่าฮ่าเยี่ยมมาก! แปลกมากมันไม่ทำงานสำหรับฉันตลอดเวลา ฉันมีบางมุมมองที่สั้นมาก ๆ พวกเขาไม่มีสโครลและอีกสองมุมมองที่มีสโครลเมื่อฉันวางonEnter: scrollContentในแต่ละมุมมองมันใช้งานได้เฉพาะในมุมมอง / เส้นทางแรกไม่ใช่มุมมองที่ 2 แปลก.
ตัวแทน Zebra

1
ฉันไม่แน่ใจว่าไม่มันแค่ไม่เลื่อนไปด้านบนเมื่อมันควร เมื่อฉันคลิกระหว่าง 'เส้นทาง' บางคนยังคงเลื่อนไปยังตำแหน่งที่มุมมอง ng ไม่ใช่มุมบนสุดของหน้าล้อมรอบ มันสมเหตุสมผลไหม
ตัวแทน Zebra

13

FYI สำหรับทุกคนที่พบปัญหาที่อธิบายในชื่อ (เหมือนที่ฉันทำ) ซึ่งใช้AngularUI Router เช่นกันปลั๊กอิน ...

ตามที่ถามและตอบในคำถาม SO นี้เราเตอร์ angular-ui จะกระโดดไปที่ด้านล่างของหน้าเมื่อคุณเปลี่ยนเส้นทาง
ไม่สามารถทราบสาเหตุที่หน้าเว็บโหลดที่ด้านล่างใช่หรือไม่ Angular UI-Router autoscroll ฉบับที่

อย่างไรก็ตามในขณะที่คำตอบระบุไว้คุณสามารถปิดพฤติกรรมนี้โดยพูดautoscroll="false"กับคุณui-viewบน

ตัวอย่างเช่น:

<div ui-view="pagecontent" autoscroll="false"></div>
<div ui-view="sidebar" autoscroll="false"></div> 

http://angular-ui.github.io/ui-router/site/#/api/ui.router.state.directive:ui-view


16
ของฉันไม่ได้กระโดดลงไปที่ด้านล่างมันคงตำแหน่งการเลื่อนไว้แทนที่จะไปด้านบน
สตีเฟ่นสมิ ธ

5
สิ่งนี้ไม่ตอบคำถาม ฉันมีปัญหาเดียวกัน - เมื่อเส้นทางเปลี่ยนระดับการเลื่อนเพียงอยู่ในที่เดียวกันแทนที่จะเลื่อนไปด้านบน ฉันสามารถเลื่อนไปที่ด้านบนได้ แต่โดยการเปลี่ยนแฮชซึ่งฉันไม่ต้องการทำด้วยเหตุผลที่ชัดเจน
จะ

7

คุณสามารถใช้จาวาสคริปต์นี้

$anchorScroll()

3
มันไม่ง่ายอย่างนั้นในเชิงมุม โซลูชันของคุณใช้ได้ใน jQuery เท่านั้น สิ่งที่ฉันกำลังมองหาเป็นวิธีที่สง่างามในการทำเช่นนี้ใน angularjs
Matias Gonzalez

4
คุณได้ลองใช้ $ anchorScroll () เป็นเอกสารdocs.angularjs.org/api/ng.%24anchorScroll
CodeIsLife

1
FYI หากคุณระบุตำแหน่งด้วย$location.hash('top')ก่อน$anchorScroll()ปุ่มเริ่มต้นไปข้างหน้า / กลับเบราว์เซอร์จะไม่ทำงาน พวกเขาคอยเปลี่ยนเส้นทางคุณไปยังแฮชใน URL
Roy

7

หากคุณใช้ ui-router คุณสามารถใช้ (ทำงานได้)

$rootScope.$on("$stateChangeSuccess", function (event, currentState, previousState) {
    $window.scrollTo(0, 0);
});

ฉันรู้ว่าสิ่งนี้ควรใช้งานได้ฉันใช้ "$ stateChangeSuccess" อย่างกว้างขวาง แต่ด้วยเหตุผลบางอย่าง $ window.scrollTo (0,0) ไม่สามารถใช้งานได้
Abhas

4

ฉันพบวิธีแก้ปัญหานี้ ถ้าคุณไปที่มุมมองใหม่ฟังก์ชันจะถูกดำเนินการ

var app = angular.module('hoofdModule', ['ngRoute']);

    app.controller('indexController', function ($scope, $window) {
        $scope.$on('$viewContentLoaded', function () {
            $window.scrollTo(0, 0);
        });
    });

3

การตั้งค่า autoScroll เป็น True นั้นไม่ใช่เคล็ดลับสำหรับฉันดังนั้นฉันจึงเลือกโซลูชันอื่น ฉันสร้างบริการที่ขอทุกครั้งที่มีการเปลี่ยนเส้นทางและใช้บริการ $ anchorScroll ในตัวเพื่อเลื่อนไปด้านบน ได้ผลสำหรับฉัน :-)

บริการ:

 (function() {
    "use strict";

    angular
        .module("mymodule")
        .factory("pageSwitch", pageSwitch);

    pageSwitch.$inject = ["$rootScope", "$anchorScroll"];

    function pageSwitch($rootScope, $anchorScroll) {
        var registerListener = _.once(function() {
            $rootScope.$on("$locationChangeSuccess", scrollToTop);
        });

        return {
            registerListener: registerListener
        };

        function scrollToTop() {
            $anchorScroll();
        }
    }
}());

การลงทะเบียน:

angular.module("mymodule").run(["pageSwitch", function (pageSwitch) {
    pageSwitch.registerListener();
}]);

3

สายไปงานเลี้ยงเล็ก ๆ น้อย ๆ แต่ฉันได้ลองทุกวิธีที่เป็นไปได้และไม่มีอะไรทำงานได้อย่างถูกต้อง นี่คือทางออกที่สง่างามของฉัน:

ฉันใช้ตัวควบคุมที่ควบคุมหน้าของฉันทั้งหมดด้วย ui-router ช่วยให้ฉันสามารถเปลี่ยนเส้นทางผู้ใช้ที่ไม่ผ่านการตรวจสอบหรือรับรองความถูกต้องไปยังตำแหน่งที่เหมาะสม คนส่วนใหญ่ใส่มิดเดิลแวร์ของพวกเขาในการตั้งค่าแอพของพวกเขา แต่ฉันต้องการคำขอ http บางส่วนดังนั้นตัวควบคุมทั่วโลกทำงานได้ดีขึ้นสำหรับฉัน

index.html ของฉันดูเหมือนว่า:

<main ng-controller="InitCtrl">
    <nav id="top-nav"></nav>
    <div ui-view></div>
</main>

initCtrl.js ของฉันดูเหมือนว่า:

angular.module('MyApp').controller('InitCtrl', function($rootScope, $timeout, $anchorScroll) {
    $rootScope.$on('$locationChangeStart', function(event, next, current){
        // middleware
    });
    $rootScope.$on("$locationChangeSuccess", function(){
        $timeout(function() {
            $anchorScroll('top-nav');
       });
    });
});

ฉันได้ลองทุกทางเลือกที่เป็นไปได้วิธีนี้ได้ผลดีที่สุด


1
นี่เป็นสิ่งเดียวที่ทำงานกับวัสดุเชิงมุมสำหรับฉันการวางid="top-nav"องค์ประกอบที่ถูกต้องก็สำคัญเช่นกัน
BatteryAcid

2

คำตอบทั้งหมดข้างต้นแบ่งพฤติกรรมของเบราว์เซอร์ที่คาดไว้ สิ่งที่คนส่วนใหญ่ต้องการคือสิ่งที่จะเลื่อนไปด้านบนหากเป็นหน้า "ใหม่" แต่กลับไปที่ตำแหน่งก่อนหน้าถ้าคุณไปถึงที่นั่นผ่านปุ่มย้อนกลับ (หรือไปข้างหน้า)

หากคุณถือว่าโหมด HTML5 สิ่งนี้กลายเป็นเรื่องง่าย (แม้ว่าฉันจะแน่ใจว่ามีคนที่สดใสบางคนสามารถรู้วิธีทำให้สิ่งนี้สวยงามยิ่งขึ้น!):

// Called when browser back/forward used
window.onpopstate = function() { 
    $timeout.cancel(doc_scrolling); 
};

// Called after ui-router changes state (but sadly before onpopstate)
$scope.$on('$stateChangeSuccess', function() {
    doc_scrolling = $timeout( scroll_top, 50 );

// Moves entire browser window to top
scroll_top = function() {
    document.body.scrollTop = document.documentElement.scrollTop = 0;
}

วิธีการทำงานคือเราเตอร์สันนิษฐานว่ามันจะเลื่อนไปด้านบน แต่ล่าช้าเล็กน้อยเพื่อให้เบราว์เซอร์มีโอกาสที่จะเสร็จสิ้น หากเบราว์เซอร์แจ้งให้เราทราบว่าการเปลี่ยนแปลงนั้นเกิดจากการนำทางย้อนกลับ / ไปข้างหน้ามันจะยกเลิกการหมดเวลาและการเลื่อนจะไม่เกิดขึ้น

ฉันใช้documentคำสั่งraw เพื่อเลื่อนดูเพราะฉันต้องการเลื่อนไปที่ด้านบนสุดของหน้าต่าง หากคุณเพียงต้องการui-viewเลื่อนจากนั้นตั้งค่าautoscroll="my_var"ตำแหน่งที่คุณควบคุมmy_varโดยใช้เทคนิคด้านบน แต่ฉันคิดว่าคนส่วนใหญ่จะต้องการเลื่อนหน้าทั้งหมดหากคุณไปที่หน้าเป็น "ใหม่"

การใช้งานดังกล่าวข้างต้น UI เตอร์แม้ว่าคุณสามารถใช้ ng เส้นทางแทนโดยการแลกเปลี่ยนสำหรับ$routeChangeSuccess$stateChangeSuccess


คุณจะใช้สิ่งนี้ได้อย่างไร คุณจะวางไว้ที่ไหนในรหัสเส้นทางเชิงมุม - UI ปกติเช่นดังต่อไปนี้ var routerApp = angular.module('routerApp', ['ui.router']); routerApp.config(function($stateProvider, $urlRouterProvider, $locationProvider) { $urlRouterProvider.otherwise('/home'); $locationProvider.html5Mode(false).hashPrefix(""); $stateProvider // HOME STATES AND NESTED VIEWS ======================================== .state('home', { url: '/home', templateUrl: 'partial-home.html' }) });
ตัวแทน Zebra

hmmm ... ไม่ทำงาน :-( เพียงฆ่าแอพ .state('web', { url: '/webdev', templateUrl: 'partial-web.html', controller: function($scope) { $scope.clients = ['client1', 'client2', 'client3']; // I put it here } }) ฉันเพิ่งจะเรียนรู้สิ่งนี้บางทีฉันอาจจะพลาดบางอย่าง: D
Agent Zebra

@AgentZebra อย่างน้อยที่สุดคอนโทรลเลอร์จะต้องใช้เวลา $ timeout เป็น input (เนื่องจากรหัสของฉันอ้างอิงถึงมัน) แต่ที่สำคัญกว่านั้นคอนโทรลเลอร์ที่ฉันพูดถึงจำเป็นต้องใช้ชีวิตในระดับที่สูงกว่าแต่ละสถานะ (คุณ อาจรวมถึงงบในตัวควบคุมระดับบนสุดของคุณ) กราฟการเรียนรู้เริ่มต้นของ AngularJS นั้นยากมาก โชคดี!
Dev93

2

ไม่มีคำตอบใดที่แก้ไขปัญหาของฉันได้ ฉันกำลังใช้ภาพเคลื่อนไหวระหว่างมุมมองกับการเลื่อนจะเกิดขึ้นหลังจากภาพเคลื่อนไหวเสมอ วิธีแก้ปัญหาที่ฉันพบเพื่อให้การเลื่อนไปด้านบนเกิดขึ้นก่อนที่ภาพเคลื่อนไหวจะเป็นคำสั่งต่อไปนี้:

yourModule.directive('scrollToTopBeforeAnimation', ['$animate', function ($animate) {
    return {
        restrict: 'A',
        link: function ($scope, element) {
            $animate.on('enter', element, function (element, phase) {

                if (phase === 'start') {

                    window.scrollTo(0, 0);
                }

            })
        }
    };
}]);

ฉันแทรกมันลงในมุมมองของฉันดังนี้:

<div scroll-to-top-before-animation>
    <div ng-view class="view-animation"></div>
</div>

2

Simple Solution เพิ่มscrollPositionRestorationในโมดูลเส้นทางหลักที่เปิดใช้งาน
แบบนี้:

const routes: Routes = [

 {
   path: 'registration',
   loadChildren: () => RegistrationModule
},
];

 @NgModule({
  imports: [
   RouterModule.forRoot(routes,{scrollPositionRestoration:'enabled'})
  ],
 exports: [
 RouterModule
 ]
 })
  export class AppRoutingModule { }


0

ในที่สุดฉันก็ได้รับสิ่งที่ฉันต้องการ

ฉันต้องการเลื่อนไปด้านบน แต่ไม่ต้องการการเปลี่ยนบางอย่าง

คุณสามารถควบคุมสิ่งนี้ได้ในระดับเส้นทางตามเส้นทาง
ฉันกำลังรวมโซลูชันข้างต้นโดย @wkonkel และเพิ่มวิธีการง่ายๆnoScroll: trueพารามิเตอร์ให้กับการประกาศเส้นทาง ถ้าอย่างนั้นฉันก็กำลังจะเปลี่ยนไป

ทั้งหมด: ทั้งหมดนี้ลอยไปด้านบนของหน้าในช่วงการเปลี่ยนภาพใหม่ซึ่งจะไม่ลอยไปด้านบนบนForward/ Backช่วงการเปลี่ยนภาพและจะช่วยให้คุณสามารถแทนที่ลักษณะการทำงานนี้หากจำเป็น

รหัส: (โซลูชันก่อนหน้ารวมทั้งตัวเลือก noScroll พิเศษ)

  // hack to scroll to top when navigating to new URLS but not back/forward
  let wrap = function(method) {
    let orig = $window.window.history[method];
    $window.window.history[method] = function() {
      let retval = orig.apply(this, Array.prototype.slice.call(arguments));
      if($state.current && $state.current.noScroll) {
        return retval;
      }
      $anchorScroll();
      return retval;
    };
  };
  wrap('pushState');
  wrap('replaceState');

ใส่ลงในapp.runบล็อกของคุณและฉีด$state...myApp.run(function($state){...})

จากนั้นหากคุณไม่ต้องการเลื่อนไปที่ด้านบนของหน้าให้สร้างเส้นทางดังนี้:

.state('someState', {
  parent: 'someParent',
  url: 'someUrl',
  noScroll : true // Notice this parameter here!
})

0

สิ่งนี้ได้ผลสำหรับฉันรวมถึงการควบคุมอัตโนมัติ

<div class="ngView" autoscroll="true" >

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.