Невозможно использовать плагин Nativescript Localstorage в проекте с общим кодом

Я пытаюсь использовать совместное использование кода Nativescript между веб-сайтом и мобильным устройством с помощью Angular, и я установил последнюю стабильную версию и т. Д. Но многие модули npm, например: "nativescript-localstorage", когда я начинаю его использовать, он дает мне: «Не удается разрешить 'tns-core-modules / file-system / file-system-access'» даже после того, как автор модуля протестировал его через несколько часов после обновления своего модуля и т. Д., Но для меня это не работает


person Bishoy Melek    schedule 13.09.2018    source источник


Ответы (4)


Я была такая же проблема. Итак, я создал сервис, который является оберткой собственного localStorage.

После этого я вставляю свою оболочку в модуль своего веб-приложения и модуль мобильного приложения. Но для модуля мобильного приложения я ввожу nativescript-localstorage вместо своей оболочки.

Подобно тому, как моя оболочка имеет те же функции, что и класс nativescript-localstorage, Angular видит только огонь, и я могу использовать свою оболочку для работы с localStorage на мобильных устройствах и в Интернете!

На самом деле, когда он находится в веб-контексте, Angular использует «родной» localStorage, а когда он находится в мобильном контексте, Angular использует библиотеку nativescript-localstorage.

Ниже моего кода.

Моя служебная оболочка:

import { Injectable } from "@angular/core";

@Injectable()
export  class CustomStorageService {    
    setItem(key, value){
        localStorage.setItem(key, value);
    }

    getItem(key){
        return localStorage.getItem(key);
    }

    removeItem(key){
        localStorage.removeItem(key);
    }

    clear(){
        localStorage.clear();
    }
}

В app.module.ts:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpClientModule } from '@angular/common/http';
import { CustomStorageService } from './commons/core/services/guard/custom-storage.service';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent,
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    HttpClientModule
  ],
  providers: [
    CustomStorageService
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

Мой app.module.tns.ts:

import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';
import { NativeScriptModule } from 'nativescript-angular/nativescript.module';
import { NativeScriptHttpClientModule } from 'nativescript-angular/http-client';
import * as mobileStorage from 'nativescript-localstorage';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent,
  ],
  imports: [
    NativeScriptModule,
    AppRoutingModule,
    NativeScriptHttpClientModule,
    NativeScriptFormsModule
  ],
  providers: [
    {
      provide: CustomStorageService,
      useValue: mobileStorage 
    }
  ],
  bootstrap: [AppComponent],
  schemas: [NO_ERRORS_SCHEMA]
})

export class AppModule { }

Пример использования обертки:

import { Injectable } from '@angular/core';
import { CustomStorageService } from './custom-storage.service';

@Injectable()
export  class TokenService {
    constructor(private storage: CustomStorageService){

    }

    getToken(): String {
        return this.storage.getItem('token');
    }

    saveToken(token: String) {
        this.storage.setItem('token',token);
    }

    destroyToken() {
        this.storage.removeItem('token');
    }

    destroyAll(){
        this.storage.removeItem('token');
        this.storage.removeItem('user_id');
        this.storage.removeItem('user_name');
        this.storage.removeItem('full_name');
    }

    destroyUser() {
        this.storage.removeItem( 'currentUser' );
    }

    cleanLocalStorage() {
        this.storage.clear();
    }

}

Надеюсь, это поможет.

person Neau Adrien    schedule 22.01.2019
comment
На это нужно дать ответ. - person j3ko; 16.06.2019

Вы можете использовать nativescript-localstorage, но имейте в виду, что это плагин, который будет работать в мобильной среде (iOS и Android), а не в веб-проекте. Тем не менее, когда вы создаете проект с совместным использованием кода (между Web и NativeScript), вы должны создать логику, которая использует плагин только в файлах NativeScript.

Например, создайте файлы, имена которых оканчиваются на .tns, и разместите там логику для плагина.

home.component.ts // web file
home.component.tns.ts // NativeScript file

Полное приложение POC, демонстрирующее вышеуказанное и использующее nativescript-localstorage, можно найти здесь. Чтобы протестировать проект на мобильном устройстве / эмуляторе, запустите

tns run android --bundle

для тестирования с помощью веб-проекта Angular запустить

ng serve -o
person Nick Iliev    schedule 13.09.2018

Ответ от Neau Adrien действительно сработал для меня, не забудьте по-прежнему импортировать CustomStorageService в свой файл module.tns.ts

import { CustomStorageService } from './services/customstorage.service'
person Rogerio Dalot    schedule 22.03.2019

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

app.module.ts (Интернет):

providers: [    
    {
      provide: Storage,
      useValue: localStorage
    }
  ]

app.module.tns.ts (мобильный):

  import * as mobileLocalStorage from 'nativescript-localstorage';

  providers: [    
        {
          provide: Storage,
          useValue: mobileLocalStorage
        }
      ]

С помощью вышеуказанной настройки вы можете внедрить Storage в свои службы и компоненты, и Angular предоставит правильную реализацию во время выполнения.

export class AuthenticationService {

    constructor(private localStorage: Storage) {
    }
}
person umutesen    schedule 30.11.2018
comment
Я использую Angular и NativeScript вместе с плагином nativescript-localstorage в проекте с совместным использованием кода. Я столкнулся с той же ошибкой, что и указано выше, и этот ответ является единственным, который заставил его работать должным образом. В большинстве других онлайн-примеров говорится о помещении плагина localstorage в компоненты tns.ts вместо компонентов ts, чтобы отделить веб-логику от мобильной логики. Но в моем случае (и, скорее всего, в случае OP) это нужно было запускать в общем служебном файле как для Интернета, так и для мобильных устройств. Это правильный способ добиться этого. - person Max Methot; 17.05.2019