Чтение локального файла JSON из Angular / Nativescript - PullRequest
0 голосов
/ 05 октября 2018

Я попытался разместить файл en.json в следующих местах:

src/assets/i18n/en.json
src/app/assets/i18n/en.json

И затем я пытаюсь прочитать файл следующим образом:

import {knownFolders, File} from 'tns-core-modules/file-system';
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
import { Observable } from 'rxjs';

export class TranslateFileLoader implements TranslateLoader {
    constructor(public prefix: string = 'assets/i18n/', public suffix: string = '.json') {}

    public getTranslation(lang: string): Observable<Object> {
      const appFolder = knownFolders.currentApp(); // Havet tried with knownFolders.documents() also
      console.log(`${this.prefix}${lang}${this.suffix}`);
      const cfgFile = appFolder.getFile(`${this.prefix}${lang}${this.suffix}`);
      console.log(File.exists(cfgFile.path));
      console.log(cfgFile.path);
      const fileData = cfgFile.readTextSync();
      console.log(fileData);
      return JSON.parse(fileData);
    }
}

console.log # 1: assets / i18n / en.json
console.log # 2: true
console.log # 3: /data/data/org.nativescript.playground/files/app/assets/i18n/en.json
console.log # 4:

Так что да, путь кажется хорошим, File.exists(cfgFile.path) возвращает true, но fileData пуст, и поэтому я получаюисключение, когда я JSON.parse(fileData).Но почему?Сначала я подумал, что файлов там нет, но я понял из моего теста.Таким образом, кажется, что файл существует, когда устройство / эмулятор работает, но я не могу прочитать его содержимое?

Есть идеи?

Спасибо
Søren

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Представьте себе среду, в которой вы запускаете свой код JS.

Если вы работаете в файле node.js, ваш код имеет смысл, и он будет работать.

, если вы работаете вв целях безопасности локальная файловая система недоступна.Однако вы должны иметь возможность извлекать файлы с сервера, а также вы можете писать и читать из локальной песочницы.

Однако этот API есть, посмотрите, работает ли он у вас: https://developer.mozilla.org/en-US/docs/Web/API/File_and_Directory_Entries_API

В своих проектах я часто сохраняю локализацию в файлах json и успешно извлекаю их с помощью:

  import { HttpClient } from '@angular/common/http';
  ..
  constructor(private http: HttpClient) {} 
  ..
  this.http.get(this.urlToFile, { responseType: 'wherever you need here text|json'}).map(res => {...});
0 голосов
/ 06 октября 2018

Я исправил это!HttpClient не работает на Native (да, моя проблема была с Nativescript на нативных устройствах, где нет http-сервера, обслуживающего файлы, и да, у меня есть доступ к локальному хранилищу).Мой код работал, но файлы * .json не были перенесены в пакеты сборки.Я должен был добавить их в mt webpack.config.js в tns-части «CopyWebpackPlugin», затем все заработало :) Я не мог вставить «File.exists», потому что мой вызов «.getFile» создал пустой файл.

0 голосов
/ 05 октября 2018

Пожалуйста, поделитесь примером игровой площадки, чтобы было легко определить, где проблема.Между вы можете даже просто импортировать JSON как.

Например, en.ts

export const languageJSON = {
   ....
};

Импортировать его как

const languageJSON = require(`${this.prefix}${lang}${this.suffix}`).languageJSON;

, так какпуть является динамическим, просто убедитесь, что ваша сборка webpack понимает его.

...