0
Thumbsup

いい質問だ

0

Thumbsdown

うーん

window.jsはどこにあるファイルでしょうか?

succhan
succhan 0

投稿日:2017-02-24 14:50:01

[ERROR] :  TiExceptionHandler: (main) [679,679] ----- Titanium Javascript Runtime Error -----
[ERROR] :  TiExceptionHandler: (main) [0,679] - In ti:/window.js:186,28
[ERROR] :  TiExceptionHandler: (main) [0,679] - Message: Uncaught TypeError: parentModule.resolveFilename is not a function
[ERROR] :  TiExceptionHandler: (main) [0,679] - Source:             resolved = parentModule.resolveFilename(moduleId);

というエラーが出ています。

ログを仕込んで、どこでエラーが出ているか調べてみると

var screen_wnd = Ti.UI.createWindow({
        title: title_bar,
        backgroundColor:'#fff',
        fullscreen: false,
        className: 'win',
        url: 'scr.js',
        orientationModes : [Titanium.UI.PORTRAIT],
        exitOnClose: true
    });
    screen_wnd.open();

という、新しい画面を開くところの「screen_wnd.open()」で、エクセプションが発生しているように思うので、それを調べようとしているのですが、「window.js」というファイルの中を見たくても、どこにあるかがわからず原因がわかりません…。

何かもっと違うところが、これの原因なのでしょうか?

教えていただたきたいです。

よろしくお願いします。



回答

yagi_
yagi_
2540
Tcad_icon Tcmd_icon Tce_icon

Thumbsup

いい回答

1

Thumbsdown

うーん



説明が長くなるので別の回答とします。

Windowオブジェクトにurlを指定する方法は、JavaScriptの実行コンテクストを現在のものとは別に生成します。というとややこしいですが、要するにブラウザでいえば別のタブを開いたような状態になります。あるタブの画面で実行されるJavaScriptが別のタブの画面に影響しないように、これらは全く別の実行環境とスレッドを持ちます。

これが問題を起こすのは、何らかのデータを共有したい場合です。実行コンテクストが分かれてしまうと、例えばカメラを起動してコールバック関数を指定した場合、正しくコールバックが呼ばれなかったりする問題を引き起こします。

限られた需要しか満たさない上に予想しない挙動の原因になることから、urlパラメータは以前からobsolete扱いでしたが、SDK 6.0から完全に廃止されました。

以前であれば

var win = Ti.UI.createWindow({
  url: 'win.js'
});

のように記述して、win.jsで

var win = Ti.UI.currentWindow;
win.add(Ti.UI.createLabel({text: 'Good bye cruel world'}));

のようなコードを書いても動作しましたが、これは「マルチコンテクスト」と呼ばれ問題が多いとみなされています。またurlパラメータが廃止されましたので、Ti.UI.currentWindowはもう機能しません。

修正方法は2通りあります。1つは単純なやり方。

var Win = require('win'),
  win = Win.createWindow({
    title: "It's a new window!"
  });
win.open();

のように記述して、win.jsを以下の内容にします。

function createWindow(params){
  var win = Ti.UI.createWindow(params);
  return win;
}
exports.createWindow = createWindow;

もう1つはAlloyを使って

var win = Alloy.createController('win', params);
win.open();

のようにして、app/views/win.xmlは

<Alloy>
  <Window>
    <Label>Good bye cruel world</Label>
  </Window>
</Alloy>

のようにして…というやり方ですが、こちらはアプリ全体をAlloyに対応させないといけません。


1つ目の簡易な方法で修正したいと思います。 win.jsのcreateWindowは、AndroidStudioでいうonCreateのような最初に呼ばれる関数になるということでしょうか? もしそうなら、Viewの生成やテキストを入れるなどの処理をこの中に描いてやらないとダメということでしょうか…? --- succhan

AndroidのLifecycle Eventとは別です。単純にreuireした先から呼び出される関数であるだけです --- yagi_

なるほど、ありがとうございます! --- succhan

yagi_
yagi_
2540
Tcad_icon Tcmd_icon Tce_icon

Thumbsup

いい回答

1

Thumbsdown

うーん



Windowを作成するのにurlを使うことはもう禁止になりました(随分前から非推奨になっています)。なかなか気が滅入りますが、scr.jsを使って新しいWindowを作成するように変更しましょう。


ありがとうございます。 urlを使った生成がダメで動いていなかったんですね…。 変更するscr.jsというのはどこにあるんでしょうか? 何か参考になるwiki等あれば教えて頂きたいです。 よろしくお願いします。 --- succhan

Alloryを使ってXMLでレイアウトを組んで生成する方法しかないんでしょうか? --- succhan

ログインすると回答することができます。