

onsen-
uiのnavigatorを利用しています。ページスタックがある場合のみ「戻る」ボタンを表示するようにしたいのですが、`navigator.resetToPage()`から発生するprepush,
postpushイベント内ではnavigator.getPages()が正しい値を返さないようです。

[code]

    navigator.on("prepush", function(e) {
      var pages = navigator.getPages();
      console.log(pages.length); //1
    });
    
    navigator.on("postpush", function(e) {
      var pages = navigator.getPages();
      console.log(pages.length); //2
    });
    
    navigator.resetToPage("pages/hoge.html");
    
[/code]

resetToPage直後のprepush,
postpush内のnavigator.getPages()ではpushPageのときと同じ値（上のコードではprepush：1,
postPush：2）が返ります。もし、そこまでにページスタックが3つ貯まっていれば、prepush：3, postPush：4 になります。

ページスタックがクリアされるため、どちらも本来はprePush：0、postPush：1が返るべきだと思います。resetToPage後、もう一度pushPageをするとクリア後の正しい値（prepush：1,
postPush：2）が返ります。

こちらの現象を回避する方法はありませんでしょうか。resetToPageのコールバックでonTransitionEndを設定すると、その中では正しい値が返るようですが、prePush、postPushを利用したいです。


CC BY-SA 3.0
2015-12-04T17:36:23.080
19638
2015-12-07T10:54:07.430
2015-12-07T10:22:55.380
8532
13405
question
monaca onsen-ui cordova
navigator.resetToPage()の際にnavigator.getPages()が正しい値を返さない


`navigator`は`window`に宣言されているので、  
`window.navigator`で呼んでみてはいかがでしょうか？

また、ページ数をチェックして戻るか決めているようですが、  
戻れるかどうかチェックをかけるだけなら  
`window.navigator.canPopPage();//true or false`  
……では、いけないのでしょうか？


CC BY-SA 3.0
2015-12-05T04:33:18.337
19648
2015-12-05T04:33:18.337
19638
answer


`resetToPage`の実装は以下のようになっています。

[code]

      resetToPage: function(page, options) {
        options = options || {};
    
        if (!options.animator && !options.animation) {
          options.animation = 'none';
        }
    
        var onTransitionEnd = options.onTransitionEnd || function() {};
        var self = this;
    
        options.onTransitionEnd = function() {
          while (self.pages.length > 1) {
            self.pages.shift().destroy();
          }
          self._scope.$digest();
          onTransitionEnd();
        };
    
        this.pushPage(page, options);
      },
    
[/code]

「ページスタックを空にしてから`pushPage()`」ではなく、「`pushPage()`が完了してからページスタックを空に」しています。`onTransitionEnd`に指定した関数は`postpush`イベントの発行後、ページスタックの破棄の後に実行されるためにご質問のような現象が起こります。  
`pushPage()`の前にページスタックを空にしないのは、`resetToPage()`でアニメーション遷移するケースを想定してのことではないかと思います（確証はありませんが）。

上記のような仕様のため、現在のバージョン1.3.14時点では`prepush`、`postpush`を用いた方法では解決できません。`onTransitionEnd`オプションを利用するか、  
`onsBackButton`ディレクティブがそうしているように`navigator.pages.length`を`$watch()`しましょう。


CC BY-SA 3.0
2015-12-07T10:54:07.430
19708
2015-12-07T10:54:07.430
8532
19638
answer