Durandal SPA飞溅百分比

时间:2014-03-31 08:38:32

标签: durandal single-page-application hottowel

如何在durandal SPA初始屏幕中显示实际百分比的加载指标。

我正在使用HotTowel SPA模板。

<div id="applicationHost">
        <div class="splash">
          <div class="message">
              Durandal Starter Project
          </div>
          <i class="icon-spinner icon-2x icon-spin active"></i>
      </div>
    </div>

1 个答案:

答案 0 :(得分:2)

这取决于您认为的进步。 Durandal在封面下使用require.js来动态加载javascript文件,因此当您第一次启动项目并加载main.js时,require正在执行查找所有请求的js文件并加载它们的工作。如果你想展示它的进展可能会很棘手。以下是有关点击requirejs加载过程的Google小组讨论的链接:

https://groups.google.com/forum/#!topic/requirejs/JX-9bHP1BBo

此方法仅在您未使用网站的编译版本时才有用。在durandal docs页面上,通过将所有js和html视图合并到一个在启动时加载的单个文件中,可以完整地展示优化项目,并且无需显示文件加载的进度。

如果您在向项目用户显示之前必须完成一些长时间运行的进程,则可以在shell模块的activate函数中执行此操作。我使用嵌套jquery promise objectsblockUI plugin完成了此操作。你需要做的是从你的激活函数返回一个promise,这将导致durandal等到你加载你的shell ui之前完成你的启动代码。在该承诺中,您使用jquery's when/then函数来调用任何数量的其他函数,这些函数也必须返回promise。对于每个被调用的函数作为参数传递一个函数来更新你的进度ui。这是我的shell激活函数的样本

function activate() {

    var def = new $.Deferred();
    try {

    var messageBoxHtml = [
    '<div class="messageBox">',
        '<div class="modal-header">',
            '<h3>Processing</h3>',
        '</div>',
        '<div class="modal-body">',
             '<p class="message" id="blockMessageTag">Processing request, please wait...</p>',
             '<div class="progress progress-striped active page-progress-bar">',
                 '<div id="blockMessageTagProgress" class="progress-bar progress-bar-warning" style="width: 0%;"></div>',
             '</div>',
        '</div>',
        '<div class="modal-footer">',
        '</div>',
    '</div>'
    ].join('\n');

    $.blockUI({ message: messageBoxHtml });

    var updateMain = function (msg) {
        def.notify(msg);
    };

    var totalProgress = 0;
    def.progress(function (newMessage) {
        logger.log("Boot Progress", "shell", newMessage);
        $("#blockMessageTag").text(newMessage + "...");
        totalProgress++;
        $("#blockMessageTagProgress").width((totalProgress * 25) + '%');
    });

    $.when(module1.dowork(updateMain), module2.dowork(updateMain))
    .done(function () {
        $.unblockUI();
        router.map([
            { route: 'Home', moduleId: 'views/myhome', title: 'Home' },
        ]).mapUnknownRoutes('views/Common/404', 'not-found')
          .activate().done(function () {
              def.resolve();
          }).fail(function (xh, status, msg) {
              logger.log(msg, "Shell Startup Failure", xh);
              $("#blockMessageTag").text("Failure: Check Console Log For Details - 1");
              $("#blockMessageTagProgress").width('0%');
              def.fail();
          });
    }).fail(function (xh, status, msg) {
        logger.log(msg, "Shell Startup Failure", xh);
        $("#blockMessageTag").text("Failure: Check Console Log For Details - 2");
        $("#blockMessageTagProgress").width('0%');
        def.fail();
    });
}
catch (ex) {
    logger.log(ex.message, "Shell Startup Failure", ex);
    $("#blockMessageTag").text("Failure: Check Console Log For Details - 3");
    $("#blockMessageTagProgress").width('0%');
    def.fail();
}
return def.promise();

}

所有module1.dowork函数也必须返回一个这样的promise:

function (uiMsgBox) {

var def = new $.Deferred();

uiMsgBox('Starting Process');

try {
    //do whatever work you need to do here
    uiMsgBox('Process Complete');
    def.resolve(jsret);
} catch (error) {
    def.reject();
}

return def.promise();

};

每次调用传递给长期运行函数的updateMain函数(module1.dowork和module2.dowork)都会调用notify返回durandal的promise。通知将导致调用进度函数并更新进度UI。我有点被骗,只是对进度条间隔进行了硬编码。条形图以0%宽度开始,并在每次调用时通过将totalProgress值增加1并将其乘以预期调用数的正确百分比来更改。每个dowork方法应该调用更新进度ui两次,因此总共4次调用使得progess增量25,(100/4)。您需要根据需要进行调整。