alloy / test / apps / advanced / inheritanceを読んでみた。継承は分かりやすいが、windowまわりがいまいちわからん。
controller/index.js
$.index.open();
function openDialog(e) {
Alloy.createController(e.source.title, {
message: 'Opened ' + e.source.title
}).openDialog($.index);
}
createControllerメソッドで文字列を渡すとコントローラーが作られる。
views/index.xmlはこんな感じになっていて
<Alloy>
<Window>
<View layout="vertical">
<Button onClick="openDialog">baseDialog</Button>
<Button onClick="openDialog">animatedDialog</Button>
</View>
</Window>
</Alloy>
Buttonのtextじゃなくてtitleで渡される(e.source.title)みたいだ。コード追っかけててちょっと引っかかった。
openDialogメソッドはそれぞれのコントローラーで実装されている。
controllers/baseDialog.js
var args = arguments[0] || {};
$.message.text = args.message || 'dialog';
exports.openDialog = function(win) {
$.refWin = win;
$.refWin.add($.cover);
$.refWin.add($.dialog);
}
exports.closeDialog = function() {
$.refWin.remove($.cover);
$.refWin.remove($.dialog);
$.refWin = $.cover = $.dialog = null;
}
refWinってなんだよ?と思ったが新しい属性作って放り込んでいるだけなのかな?あとWindowにWindowを追加してんの?($.refWin.add)。それとも$.cover,$dialogはviewなんだろうか?コンパイル後のコードを読むにはどうしたらいいんだろうか?
継承はexports.baseControllerにスーパークラスを指定する。あとは普通にメソッドを上書きすればいい。
// Establish inheritance from baseDialog
exports.baseController = 'baseDialog';
// Override baseDialog's openDialog() function. We will still
// be able to use baseDialog's closeDialog() function.
exports.openDialog = function(win) {
$.refWin = win;
...
}