質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Onsen UI

HTML5で記述されたモバイルアプリの高速化、およびネイティブアプリライクなUIが作れるフレームワーク。 様々なJavaScriptフレームワークと併せて使用することができます。スマートフォン向けアプリ、Webサイトに必要なアニメーション、UI/UXを実装することが可能になります。

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

Q&A

解決済

1回答

3278閲覧

ons-dialog のshow()メソッドでUnhandled promise rejectionが起きる

退会済みユーザー

退会済みユーザー

総合スコア0

Onsen UI

HTML5で記述されたモバイルアプリの高速化、およびネイティブアプリライクなUIが作れるフレームワーク。 様々なJavaScriptフレームワークと併せて使用することができます。スマートフォン向けアプリ、Webサイトに必要なアニメーション、UI/UXを実装することが可能になります。

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

0グッド

0クリップ

投稿2017/02/21 12:46

編集2017/02/22 02:20

###前提・実現したいこと
Monaca クラウド IDEで
「Onsen UI V2 Angular 1 Splitter」のテンプレートをベースにアプリを作成しています。
アプリ起動時最初にログインダイアログを表示しようとしているのですが
ダイアログの起動がデバッカー(Android)だととても不安定です。(プレビューでは問題なく出ます)

ダイアログが出なくなる時はshow()メソッド付近でUnhandled promise rejectionが起きます。

###発生している問題・エラーメッセージ

www/lib/onsenui/js/angular-onsenui.min.js:8 304SH Onsen UI require jqLite. Load jQuery after loading AngularJS to fix this error. jQuery may break Onsen UI behavior. www/js/main.js:5 304SH Onsen UI is ready! www/js/main.js:7 304SH createDialog www/js/main.js:9 304SH createDialog_end www/components/loader.js:23279 304SH Unhandled promise rejection

###該当のソースコード
index.html

<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <meta http-equiv="Content-Security-Policy" content="default-src * data:; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'"> <script src="components/loader.js"></script> <script src="lib/angular/angular.min.js"></script> <script src="lib/onsenui/js/onsenui.min.js"></script> <script src="lib/onsenui/js/angular-onsenui.min.js"></script> <link rel="stylesheet" href="components/loader.css"> <link rel="stylesheet" href="lib/onsenui/css/onsenui.css"> <link rel="stylesheet" href="lib/onsenui/css/onsen-css-components.css"> <link rel="stylesheet" href="css/style.css"> <script src="js/main.js"></script> </head> <body> <ons-template id="login.html"> <ons-dialog var="LoginDialog" ng-controller="loginController"> <div class="main-dialog"> <p><ons-input type="text" placeholder="アカウント" id="username"></ons-input></p> <p><ons-input type="password" placeholder="パスワード" id="password"></ons-input></p> <p><ons-button modifier="large" ng-click="clickLogin()">ログイン</ons-button></p> <div id="errMessageDialog" style="color:red">エラー</div> </div> </ons-dialog> </ons-template> <ons-splitter ng-controller="AppController as app" var="splitter"> <ons-splitter-side side="left" width="220px" collapse swipeable> <ons-page> <ons-list> <ons-list-item ng-click="app.load('home.html')" tappable> Home </ons-list-item> <ons-list-item ng-click="app.load('settings.html')" tappable> Settings </ons-list-item> <ons-list-item ng-click="app.load('about.html')" tappable> About </ons-list-item> </ons-list> </ons-page> </ons-splitter-side> <ons-splitter-content page="home.html"></ons-splitter-content> </ons-splitter> <ons-template id="home.html"> <ons-page> <ons-toolbar> <div class="left"> <ons-toolbar-button ng-click="app.toggle()"> <ons-icon icon="md-menu"></ons-icon> </ons-toolbar-button> </div> <div class="center"> Main </div> </ons-toolbar> <p style="text-align: center; opacity: 0.6; padding-top: 20px;"> Swipe right to open the menu! </p> </ons-page> </ons-template> <ons-template id="settings.html"> <ons-page> <ons-toolbar> <div class="left"> <ons-toolbar-button ng-click="app.toggle()"> <ons-icon icon="md-menu"></ons-icon> </ons-toolbar-button> </div> <div class="center"> Settings </div> </ons-toolbar> </ons-page> </ons-template> <ons-template id="about.html"> <ons-page> <ons-toolbar> <div class="left"> <ons-toolbar-button ng-click="app.toggle()"> <ons-icon icon="md-menu"></ons-icon> </ons-toolbar-button> </div> <div class="center"> About </div> </ons-toolbar> </ons-page> </ons-template> </body> </html>

main.js

var module = ons.bootstrap(); ons.ready(function() { console.log("Onsen UI is ready!"); ons.createDialog('login.html').then(function(dlg){ console.log("createDialog"); LoginDialog.show(); console.log("createDialog_end"); }); }); module.controller('loginController', function($scope) { alert("loginController"); $scope.clickLogin = function(){ alert("click"); LoginDialog.hide(); splitter.content.load('home.html'); }; }); module.controller('AppController', function($scope) { this.load = function(page) { $scope.splitter.content.load(page); $scope.splitter.left.close(); }; this.toggle = function() { $scope.splitter.left.toggle(); }; });

###試したこと
.show()メソッドでcatchしてみました。

LoginDialog.show().then(function(a){console.log("ok:" + a)}).catch(function(err){console.log("err:" + err)});

ログ

www/js/main.js:5 304SH Onsen UI is ready! www/js/main.js:7 304SH createDialog www/js/main.js:9 304SH createDialog_end www/js/main.js:8 304SH err:TypeError: Cannot read property 'style' of null

なぜこのようなエラーがでるのか見当もつきません。

仕方なくダイアログを使わない方向で進めてますが
できれば解決したいです。
よろしくお願いいたします。

###補足情報(言語/FW/ツール等のバージョンなど)
iOSのほうでは特に問題ありませんでした。
Androidバージョンは4.4.2です。(ちょっと古いです・・・)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Androidバージョンが新しいからなのか、事象の再現はさせられませんでした。
エラーの内容「Cannot read property 'style' of null」というのは、何かしらの親オブジェクトが持つstyleという子オブジェクト(プロパティ)を呼び出そうとしているものの、親オブジェクトがnullなのでプロパティが読み込めないというような意味です。
(直訳すると「nullのstyle属性が読み込めません」ですが、本来はnullに何らかのオブジェクトが入るべきであると想定されます)

「style」というキーワードはindex.html中にいくつかありますが、関わりがありそうなのは以下の一行ですね。一度style属性を削除してみてはいかがでしょうか。

HTML

1<div id="errMessageDialog" style="color:red">エラー</div>

また、以下のコードの「LoginDialog」というのはindex.htmlのlogin.htmlをvar属性で宣言した名前ですね。
これは、せっかくdlgという返り値を持ってきているので、LoginDialog.show();ではなくdlg.show();と書き換えてみてはいかがでしょうか。当方の再現環境では上記の通り書き換えても問題なく動くことを確認しています。

javascript

1ons.ready(function() { 2 console.log("Onsen UI is ready!"); 3 ons.createDialog('login.html').then(function(dlg){ 4 console.log("createDialog"); 5 LoginDialog.show(); 6 console.log("createDialog_end"); 7 }); 8});

前述の通り、「本来事前に値が設定されるべき何らかのオブジェクトが、ときたまnullのまま次の処理に進んでしまうことがある」ということが原因であると予想されますので、例えばvar属性による参照が何か間に合わないことがある等の事象があるのかもしれません。戻り値であるdlgを用いるほうが安全のような気がします。

投稿2017/02/22 04:43

akabee

総合スコア1947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/05/12 05:21

ご丁寧な解答ありがとうございます。 ひとまずダイアログの使用は諦めて作成いたしました。 Androidですとバージョンが古いのか 他にもいくつかエラーになる事象が発生しました。 ですがテストを重ねて javascriptエラーは致命的なもの以外はなるべく無視することにしました(気にはなりますが)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問