2

我正在使用 HTML/CSS/JS 和 WinJS 框架为 Windows 商店开发应用程序。

我的应用程序需要在启动时加载配置数据,如果在线则通过网络加载,如果不在线则在本地加载。

我的问题是,理想情况下,应用程序应该只显示带有进度控件的启动屏幕,直到数据加载完毕。但我不知道将我的加载代码放在哪里来实现这一点。

我可以做这样的事情:

(function () {
    "use strict";

    WinJS.Binding.optimizeBindingReferences = true;

    var app = WinJS.Application;
    var activation = Windows.ApplicationModel.Activation;
    var nav = WinJS.Navigation;

    function loadConfig() {
        return WinJS.xhr({ url: myURL }).then(
            function (xhr) {
                // parse response stuff
            },
            function (xhr) {
                // do error handling stuff
            }
        );
    }

    function initializeUI(args) {
        // The generated code for setting up the navigation controller, but moved to a seperate function
        args.setPromise(WinJS.UI.processAll().then(function () {
            if (nav.location) {
                nav.history.current.initialPlaceholder = true;
                return nav.navigate(nav.location, nav.state);
            } else {
                return nav.navigate(Application.navigator.home);
            }
        }));
    }

    app.onactivated = function (args) {
        if (args.detail.kind === activation.ActivationKind.launch) {
            if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {

                loadConfig().then(
                    function () {
                        initializeUI(args);
                    }
                );
            } 
            if (app.sessionState.history) {
                nav.history = app.sessionState.history;
            }
            if ( config ) // check if configuration exists to prevent calling this twice
                initializeUI(args)
        }
    };
    app.start();
})();

但这会在加载数据之前显示我的“default.html”页面,所以我必须在“default.html”中使用我的启动图像并插入一个进度控件。

这感觉不是我的问题的正确解决方案?

4

1 回答 1

3

您的解决方案看起来不错。您应该查看扩展初始屏幕示例,以获得正确设置扩展初始屏幕的感觉,使其无缝。

你觉得哪里不对?

另一个建议的调整:更改您的 loadConfig 调用,以始终返回一个承诺,即使数据存储在本地;这样,您的代码可以以相同的方式流动,而您永远不需要您的

if(config) {
    initializeUI(args);
}

代码。

于 2012-11-15T15:40:06.583 回答