Drkcore

04 11 2012 javascript Ti Tweet

Alloyでの継承(というより別のところが理解できてない)

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; 
 ...

}

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021