Как загрузить угловой объект vm.fields из удаленно сгенерированного json?

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

Однако было бы гораздо лучше иметь возможность загружать их из отдельного API.

$.getJSON() обеспечивает хороший способ загрузки json, но я не нашел подходящего места для этого. Очевидно, что это должно быть завершено до начала этапа компиляции.

Я вижу, что в форме есть средство fieldTransform. Можно ли это использовать для преобразования vm.fields из пустого объекта во все, что приходит из API?

Если да, то как бы я это сделал?

Спасибо. Павел


person user1712240    schedule 25.06.2015    source источник


Ответы (2)


На веб-сайте есть пример, который делает именно то, что вы просите. о. Он использует $timeout для имитации асинхронной операции для загрузки конфигурации поля, но вы можете так же легко использовать собственный $http angular для получения json с сервера. Он скрывает форму за ng-if и показывает форму только тогда, когда возвращаются поля (когда ng-if принимает значение true, шаблон компилируется).

person kentcdodds    schedule 25.06.2015
comment
спасибо @kentcdodds. Пример был очень полезным, вводя $q. Поэтому мне нужно заменить getFields() в этом примере на $http.get('fields'json'). Это создает обратный вызов, а не возвращаемое значение, поэтому я не понимаю, как заставить getFields() возвращать это. Спасибо. Павел - person user1712240; 26.06.2015
comment
привет, ты получил вывод, прочитав локальный файл json через angular? - person balajivaishnav; 03.06.2016

Спасибо @kent

Итак, нам нужно заменить обещание getFields() на это

function getFields() {
  return $http.get('fields-demo.json', {headers:{'Cache-Control':'no-cache'}});
}       

Это возвращает data.fields, поэтому в vm.loadingData мы говорим

vm.fields = result[0].data;

Кажется, работает на OK для меня.

При тестировании я заметил, что вы должны убедиться, что с вашим json все в порядке, например, с использованием типа поля, который вы не определили. В этом случае результирующее сообщение об ошибке не очень понятно.

Кроме того, вам необходимо иметь дело с ситуацией, когда источник данных недоступен. Я пробовал это:

function getFields() {
  console.log('getting',fields_url);
    return $http.get(fields_url, {headers: {'Cache-Control':'no-cache'}}).
    error(function() {
      alert("can't get fields from server");
      //return new Promise({status:'fields server access error'}); //??
    });

.. который, по крайней мере, выдает предупреждение. Однако я не уверен, как заменить обещание, чтобы передать ошибку обратно вызывающей стороне.

Павел

person user1712240    schedule 27.06.2015
comment
конечно, это плохо обрабатывает ошибки и по-прежнему возвращает обещание, содержащее сообщение об ошибке вместо данных, когда, например, вызываемая служба недоступна. - person user1712240; 29.06.2015