首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JS Globalize load json cldr

JS Globalize load json cldr
EN

Stack Overflow用户
提问于 2014-08-13 08:45:24
回答 1查看 6.4K关注 0票数 5

我对最新版本的globalize.js有问题。要使用它,我必须加载cldr modules和语言定义。

现在,我从全球化文档中获得了这个示例:

代码语言:javascript
复制
// loading needed modules
$.get('/Scripts/cldr/supplemental/likelySubtags.json', Globalize.load);
$.get('/Scripts/cldr/main/en/numbers.json', Globalize.load);
$.get('/Scripts/cldr/main/de/numbers.json', Globalize.load);

// set current language
lobalize.locale('de-de');

我现在的问题是本地json文件是加载异步的。这意味着,在我的脚本试图设置当前语言的时候,模块还没有加载。

现在我试着变得聪明,做了这样的事情:

代码语言:javascript
复制
$.get('/Scripts/cldr/supplemental/likelySubtags.json', function (data) {
        Globalize.load(data);
        Globalize.locale('de-de');
});

$.get('/Scripts/cldr/main/en/numbers.json', Globalize.load);
$.get('/Scripts/cldr/main/de/numbers.json', Globalize.load);

这将工作,直到我真正使用全球化格式方法。在我的HTML中,我在敲除绑定中使用globalize,如下所示:

代码语言:javascript
复制
<span data-bind="text: Globalize.formatNumber(SomeNumber, { maximumFractionDigits: 0 })"></span>

现在,"formatNumber“方法抛出了一个错误,因为在绑定发生时并非所有模块都已加载。

我现在的问题是,我如何同步我的JavaScript?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-13 14:58:38

解决这一问题的方法实际上有两种:

  1. 使用$.ajaxasync: false选项加载json模块。
  2. 使用递延对所有ajax请求进行单个回调。

1.使用async: false

您可以使用更通用的方法$.ajax而不是$.get (参见描述)。它有async选项:

默认情况下,所有请求都是异步发送的(即默认设置为true )。如果需要同步请求,请将此选项设置为false。

因此,您可以按照以下方式重写请求:

代码语言:javascript
复制
$.ajax({
    url: '/Scripts/cldr/supplemental/likelySubtags.json',
    type: 'GET',
    async: false,
    success: function(data) {
        Globalize.load(data);
    }
});

您对所有3个请求都执行此操作,然后调用:

代码语言:javascript
复制
// set current language
lobalize.locale('de-de');

就像你以前一样。但是现在,由于所有的请求都是同步完成的,所以这段代码应该可以像预期的那样工作。这种解决方案的缺点是它具有同步请求,这将导致一些延迟。这就是为什么我建议你第二种选择:

2.使用延迟:,您可以使用$.when()函数将所有三个请求的成功回调组合为如下所示:

代码语言:javascript
复制
$.when($.get('/Scripts/cldr/supplemental/likelySubtags.json'), 
       $.get('/Scripts/cldr/main/en/numbers.json'), 
       $.get('/Scripts/cldr/main/de/numbers.json'))
.done(function(result1, result2, result3) {
    Globalize.load(result1[0]); //contains data of first executed request
    Globalize.load(result2[0]); //contains data of second executed request
    Globalize.load(result3[0]); //contains data of third executed request
    // set current language
    lobalize.locale('de-de');
    // here you should fire your knockout binding
});

好的是现在所有的请求都是异步完成的。但这仍然不能解决你的淘汰赛绑定问题。要解决这个问题,在加载所有数据时,还应该在成功回调中调用ko.applyBindings

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25281816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档