JavaScript   发布时间:2022-04-16  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了javascript – 在durandal中长时间运行加载操作大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试找出运行长时间运行加载操作的最佳位置是使用Durandal.

据我所知,加载数据的一般建议是在ViewModel的activate方法中,这就是我通常所做的事情 – 类似于:

viewModel.activate = function () {
    var loadPromise = myService.loadData();

    return $.when(loadPromise).then(function (loadedData) {
        viewModel.data(data);
    });
};

我知道如果我不在这里回复承诺,那么绑定通常会出现问题 – 如this question and answer indicates.

但是,在activate方法中执行长时间运行的加载操作会使应用程序在加载操作完成时“冻结”.例如,如果我的负载现在是这样的呢?

viewModel.activate = function () {
    // All loads return a promise
    var firstLoad = myService.loadFirstData();
    var secondLoad = myService.loadSecondData();
    var thirdLoad = myService.loadThirdDataWhichTakesAges();

    return $.when(firstLoad,secondLoad,thirdLoad).then(function (one,two,three) {
        viewModel.one(one);
        viewModel.two(two);
        viewModel.three(three);
    });
};

在这种情况下,URL会更新以反映正在加载的页面,但页面内容仍然显示上一页(我的意思是“冻结”).

理想情况下,如果URL应更改为新页面,并且页面内容也应显示新页面(即使尚未返回该页面的数据),也会很好.然后,当每个加载操作返回时,当数据绑定到视图模型时,应更新页面的相关部分.

是否有推荐的方法在Durandal内部实现这一目标?

我目前的解决方案是在activate方法中启动加载,然后在viewAttached方法中填充数据:

var loadPromise;

viewModel.activate = function () {
    // All loads return a promise
    var firstLoad = myService.loadFirstData();
    var secondLoad = myService.loadSecondData();
    var thirdLoad = myService.loadThirdDataWhichTakesAges();

    loadPromise = $.when(firstLoad,thirdLoad);

    // Don't return the promise - let activation proceed.
};

viewModel.viewAttached = function () {
    $.when(loadPromise).then(function (one,three) {
        viewModel.one(one);
        viewModel.two(two);
        viewModel.three(three);
    });
};

它似乎工作,但我记得在某处依赖viewAttached阅读并不是一个好的解决方案.我也不确定是否存在竞争条件,因为我允许激活继续进行.

还有其他建议吗?

解决方法

你不必返回一个promise,但是在这种情况下你必须在你的敲除绑定中处理这个,所以你不会绑定到未定义的元素.您可以尝试在激活中删除“返回”,但添加一个属性,指示模型是否仍在加载.像这样的东西:
viewModel.isLoading = ko.observable(false);
viewModel.activate = function () {
   isLoading(true);
   var loadPromise = myService.loadData();

   $.when(loadPromise).then(function (loadedData) {
      viewModel.data(data);
      isLoading(false);
   });
};

然后,在您的视图中,您可以在视图仍在加载时显示一个部分,在加载完成时显示一个部分.有些人喜欢:

<div data-bind:"visible: isLoading()">Loading Data....</div>
<div data-bind:"visible: !isLoading()">Put your regular view with bindings here. Loading is done so bindings will work.</div>

大佬总结

以上是大佬教程为你收集整理的javascript – 在durandal中长时间运行加载操作全部内容,希望文章能够帮你解决javascript – 在durandal中长时间运行加载操作所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: