2014-08-13 6 views
5

У меня проблема с последней версией globalize.js. Чтобы работать с ним, мне пришлось загрузить cldr modules и определения языка.JS Globalize - load json cldr

Теперь у меня был этот пример из Globalize документы:

// 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 загружаются асинхр. Это означает, что в момент, когда мой скрипт пытается установить текущий язык, модули еще не загружены.

Теперь я пытался быть умным, и сделал это:

$.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); 

Это будет работать, пока я действительно не использовал Globalize формат Methode. Внутри моего HTML я использую глобализовать внутри нокаута связывания, как это:

<span data-bind="text: Globalize.formatNumber(SomeNumber, { maximumFractionDigits: 0 })"></span> 

Теперь метод «FormatNumber» бросает ошибку, потому что не все модуля загружаются в момент связывания случилось.

Вопрос теперь, как я могу синхронизировать свой JavaScript?

ответ

9

Есть на самом деле 2 пути решения проблемы:

  1. Использование $.ajax с async: false возможностью загружать модули JSon.
  2. Используйте deferreds, чтобы иметь один обратный вызов для всех ваших запросов ajax.

1. Использование async: false

Вы можете использовать более общий метод $.ajax вместо $.get (см description). Он имеет async:

По умолчанию все запросы отправляются асинхронно (т. Е. По умолчанию это значение равно true). Если вам нужны синхронные запросы, установите для этого параметра значение false.

Таким образом, вы можете переписать ваши запросы следующим образом:

$.ajax({ 
    url: '/Scripts/cldr/supplemental/likelySubtags.json', 
    type: 'GET', 
    async: false, 
    success: function(data) { 
     Globalize.load(data); 
    } 
}); 

Вы делаете это для всех 3 ваших запросов, а затем вызвать:

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

Так же, как вы делали раньше. Но теперь, поскольку все запросы выполняются синхронно, этот код должен работать должным образом. Недостатком этого решения является то, что он имеет синхронные запросы, которые могут вызвать некоторые задержки. Вот почему я предлагаю вам второй вариант:

2.Использование deferreds: Вы можете использовать $.when() функцию, чтобы объединить успех обратного вызова всех трех запросов к одному, как это:

$.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 также должен быть вызван при успешном обратном вызове, когда все данные загружены.

+0

Спасибо, что функция. Я думаю, что теперь я должен создать некоторую общую функцию «Init», потому что я не хочу вставлять этот код на каждую страницу vie. Поэтому я считаю, что лучший способ - поместить его на страницу макета и вызвать функцию «viewinit», которая находится внутри страницы просмотра. Пух это было намного проще в старой версии глобализации. –

+1

@SteffenMangold, добро пожаловать! Если бы вы использовали любой из подходов, не могли бы вы принять ответ? –

+0

Большое вам спасибо, @IlyaLuzyanin! Это очень помогло. Теперь мне просто нужно выяснить, как загрузить мои внешние и встроенные скрипты внутри проделанной функции, так как они имеют зависимости от загружаемой глобализации .... – Johannes

Смежные вопросы