3

我正在学习使用 Titanium 制作 iPhone/Android 应用程序。我正在使用合金 MVC 框架。我以前从未使用过 javascript,除了 HTML 中的简单脚本来访问 DOM 或类似的东西,所以我以前从来不需要构造代码。

现在,使用 Titanium,我必须使用大量 JS 代码,并且我一直在寻找构建代码的方法。基本上我找到了 3 种方法来做到这一点:原型、命名空间和函数内部的函数。

每个的简单示例:

原型

NavigationController = function() {
    this.windowStack = [];
};

NavigationController.prototype.open = function(windowToOpen) {
    //add the window to the stack of windows managed by the controller
    this.windowStack.push(windowToOpen);

    //grab a copy of the current nav controller for use in the callback
    var that = this;
    windowToOpen.addEventListener('close', function() {
        if (that.windowStack.length > 1)
        {
            that.windowStack.pop();
        }
    });

    if(Ti.Platform.osname === 'android') {
        windowToOpen.open();
    } else {
        this.navGroup.open(windowToOpen);
    }
};

NavigationController.prototype.back = function(w) {
    //store a copy of all the current windows on the stack
    if(Ti.Platform.osname === 'android') {
        w.close();
    } else {
        this.navGroup.close(w);
    }
};

module.exports = NavigationController;

将其用作:

var NavigationController = require('navigator');
var navController = new NavigationController();

命名空间(或者我认为是这样的,因为使用 me = {}):

exports.createNavigatorGroup = function() {
    var me = {};

    if (OS_IOS) {   
        var navGroup = Titanium.UI.iPhone.createNavigationGroup();  
        var winNav = Titanium.UI.createWindow();
        winNav.add(navGroup);

        me.open = function(win) {
            if (!navGroup.window) {
                // First time call, add the window to the navigator and open the navigator window
                navGroup.window = win;
                winNav.open();
            } else {
                // All other calls, open the window through the navigator
                navGroup.open(win);
            }
        };

        me.setRightButton = function(win, button) {
            win.setRightNavButton(button);
        };

        me.close = function(win) {
            if (navGroup.window) {
                // Close the window on this nav
                navGroup.close(win);
            }
        };
    };

    return me;
};

将其用作:

var ui = require('navigation');
var nav = ui.createNavigatorGroup();

函数内部的函数

function foobar(){
    this.foo = function(){
        console.log('Hello foo');
    }

    this.bar = function(){
        console.log('Hello bar');
    }
}

// expose foobar to other modules
exports.foobar = foobar;

将其用作:

var foobar = require('foobar').foobar
var test = new foobar();

test.bar(); // 'Hello bar'

现在我的问题是:哪个更好地保持代码干净和清晰?原型似乎很容易阅读/维护。命名空间让我有点困惑,但只需要执行初始函数即可“可用”(在声明它时不使用 new,我想是因为它返回对象?命名空间?“我”)。最后,functions inside functions与上一个类似,所以我不知道确切的区别,但是只导出main函数并让所有内部函数可供以后使用是有用的。

也许最后两种可能性是相同的,我在搞乱概念。

请记住,我正在寻找一种构建代码的好方法,并让其他模块和自己的模块内部都可以使用函数。

我感谢任何澄清。

4

1 回答 1

1

在他们发布的示例中,Appcelerator 似乎遵循了非原型方法。您可以在他们发布的示例中看到它:https ://github.com/appcelerator/Field-Service-App 。

我已经看到了很多不同的方法来构建钛合金之前的应用程序。从 Alloy 开始,我发现遵循开发团队的示例对我很有帮助。

话虽如此,在我看来,所有这一切仍在解释中,并对变化和社区发展持开放态度。在 Alloy 之前,有一些关于构建应用程序的很棒的社区建议,我相信它仍然对 Alloy 开放。通常,当我找到某人的示例代码时,我会看到他们用它做的一些事情似乎比我想象的要好一些。它似乎使它更容易一些。

我认为您应该以对您有意义的方式构建您的应用程序。您可能会偶然发现使用 Alloy 开发应用程序的更好、更简单的方法,因为您正在以批判的眼光看待它。

我没有找到很多广泛的 Alloy 示例,但 Field-Service-App 对我来说很有意义。它们对 MVC 之外的应用程序中的元素进行了很好的分离。一探究竟。

于 2013-08-27T14:46:00.963 回答