我正在研究我的第一个NPM模块.我以前简单地使用过打字稿,但是一个很大的问题是,对于许多模块,没有可用的定义文件.所以我认为用打字稿写我的模块是个好主意.
但是,我找不到有关最佳方法的任何信息.我发现了这个相关问题" 我可以在coffeescript中编写npm包吗? ",人们建议只发布javascript文件.但与coffeescript文件相比,如果在打字稿应用程序中使用打字稿文件,那么打字稿文件实际上可能很有用.
我应该在发布NPM模块时包含Typescript文件,还是应该只发布javascript文件并将生成的.d.ts文件提供给DefinitelyTyped?
我注意到由于以下错误,我们CI上的构建开始失败:
Discovered plugin "cordova-plugin-app-version" in config.xml. Adding it to the project
Installing "cordova-plugin-app-version" for android
Adding cordova-plugin-app-version to package.json
Using "requireCordovaModule" to load non-cordova module "q" is not supported. Instead, add this module to your dependencies and use regular "require" to load it.
[ERROR] Exception:
The command '/bin/sh -c ionic cordova platforms add android' returned a non-zero code: 1
Run Code Online (Sandbox Code Playgroud)
在iOS和Android上都发生相同的问题。
经过一番挖掘,我发现cordova 9.0.0是最近发布的。
有几个与此问题相关的更改。
我的第一个想法是,某种程度上我们没有锁定cordova版本,但是我们确实将其锁定到cordova@8.1.2了dockerfile中。我也在本地计算机和Cordova版本上进行了测试8.1.2。所以这不是问题。
在查看了更多日志之后,我注意到了一些类似以下的日志:
cordova-android version check failed ("/app/platforms/android/cordova/version"), …
我想创建一个简单的组件并将其包含在页面上.我用ionic g component my-header(ionic-cli v3 beta)创建它,修复了IonicPageModule错误,然后添加到另一个页面.然后我得到这个错误:
Error: Uncaught (in promise): Error: Template parse errors:
'my-header' is not a known element:
1. If 'my-header' is an Angular component, then verify that it is part of this module.
2. If 'my-header' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.
Run Code Online (Sandbox Code Playgroud)
"MyHeaderComponent"自动添加到@NgModule声明中.
谢谢你的帮助.
编辑:
该组件位于我的components文件夹中:
组件/我的头/我-了header.html
<div>
{{text}}
</div>
Run Code Online (Sandbox Code Playgroud)
组件/我的头/我-header.module.ts
import { NgModule } from '@angular/core';
import { IonicModule } from …Run Code Online (Sandbox Code Playgroud) 我正在用通过 npm 发布的打字稿构建一个库。
在作为库起点的 index.ts 中,导出了所有公共类和枚举。
import { MyClass } from './internal/my-class'
import { MyEnum } from './internal/my-enum'
export { MyClass, MyEnum }
Run Code Online (Sandbox Code Playgroud)
这很有效,但我注意到用户也可以通过使用文件的直接路径来导入内部函数/类等。
// in a project that installed my library as an npm dependency
import { InternalClass } from 'my-lib/dist/internal/internal-class'
Run Code Online (Sandbox Code Playgroud)
有没有办法防止这种情况?
我需要“导出”,InternalClass因为我在整个库中导入和使用它,但我不想公开它。我尝试使用命名空间,但无法真正让它工作。
我试图将我的Ionic2.beta11应用程序移植到新的Ionic2.rc0版本.大多数事情都非常简单,但我对AoT编译器有疑问.
我有一个AuthService:
@Injectable()
export class AuthService {
constructor(@Inject(Http) http: Http) {
this.http = http;
}
...
}
Run Code Online (Sandbox Code Playgroud)
我将它注入我的src/app/app.module.ts文件中的应用程序:
@NgModule({
declarations: [
MyApp,
...
],
imports: [
IonicModule.forRoot(MyApp)
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
...
],
providers: [
AuthService
]
})
Run Code Online (Sandbox Code Playgroud)
运行离子服务时一切正常,但是当我尝试构建它时,我收到以下错误:
ngc error: Error: Error at .../.tmp/app/app.module.ngfactory.ts:397:78: Supplied parameters do not match any signature of call target.
Run Code Online (Sandbox Code Playgroud)
396 - 399行:
get _AuthService_74():import44.AuthService {
if ((this.__AuthService_74 == (null as any))) { (this.__AuthService_74 = new import44.AuthService()); }
return this.__AuthService_74;
} …Run Code Online (Sandbox Code Playgroud) 我最近遇到了一个名为cordova-plugin-qrscanner(https://github.com/bitpay/cordova-plugin-qrscanner)的相当新的cordova插件.我之前一直在使用其他QR扫描仪,但这些只是覆盖某种原生相机UI,直到QR被扫描然后返回到应用程序.
但是,这个插件的方法有点不同.实际上,相机显示在您的应用程序"后面",您必须使所有内容都透明才能看到它.
这非常有趣,因为您可以使用HTML和CSS轻松添加自定义叠加层.但是,我不太清楚这里最好的方法是什么.
添加插件后,只是调用QRScanner.scan(displayContents);你看不到任何东西,但扫描仪已经在后台运行.然后,我从应用程序中递归删除任何样式(请参阅删除页面中所有样式的最简单方法),并将background-color设置为透明,以查看它是否有效.它确实如此,但我显然仍然可以看到之前显示的文本.
我想我可以创建并推送带有叠加层的新页面,将背景颜色设置为透明,然后在扫描代码后导航回来.但这感觉非常黑客.
有人有更好的解决方案吗?
例如,有没有办法用覆盖层"交换"应用程序的整个可见部分,并在扫描代码后恢复状态?
谢谢你的帮助.
编辑:
它不是同一个插件,但这篇文章与我的问题相关.
http://www.joshmorony.com/ionic-go-create-a-pokemon-go-style-interface-in-ionic-2/
应用css样式有效,但同样,应用程序的其余部分无法使用.
我正在将一些设置存储到本地存储中,并且我想在从/向存储获取(并且理想情况下还插入)值时输入响应。
据我所知,最好的方法似乎是使用函数重载。所以这就是我现在所拥有的并且它有效:
export enum SettingsKey {
hasOnboarded = 'hasOnboarded',
phoneNumber = 'phoneNumber'
}
export async function getSetting(storage: Storage, key: SettingsKey.phoneNumber): Promise<string>
export async function getSetting(storage: Storage, key: SettingsKey.hasOnboarded): Promise<boolean>
export async function getSetting(storage: Storage, key: any) {
return storage.get(key)
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢这个解决方案的一点是,可能会忘记在枚举中添加一个新元素到重载类型定义中。有没有办法强制处理所有枚举值?或者有没有更好的方法来完全做到这一点?
我认为这将是一件简单的事情,从值hasOnboarded到返回类型的映射boolean等,但这显然不是那么容易。
在我看来,条件类型可能会解决这个问题,但我无法完全理解它是如何工作的。
我也看到了这种方法,但这似乎有点过多的开销。
任何见解将不胜感激!
enums overloading typescript typescript-typings conditional-types
我目前正在开发我的第一个Ionic App,并且是第一次使用Angular.
我正在使用饼图库在应用程序的仪表板上显示图表.如果我在仪表板上刷新时这很好用,看起来像这样:
https://imgur.com/YUCAO6i,oakGp8c#1
但是,如果我导航到另一个选项卡,让我们说服务器选项卡,然后在那里刷新,则宽度和高度不会应用于仪表板上的图表.相反,它们使用标准宽度和高度(500h x 900w而不是100h x 100w)进行渲染.(见imgur的第二张照片).如果我再次在仪表板上刷新,它们将正常渲染.
我浏览了库的源代码,发现当在仪表板上刷新时,元素[0] .parentElement.offsetWidth等于100,但是如果我在另一个视图上刷新时它是0,那么使用默认值.看起来像饼图指令在另一个视图上无法访问父级.
这是使用的HTML和CSS:
HTML
<div class="pieChart">
<pie-chart data="server.chartData.cpu" options="chartOptions"></pie-chart>
</div>
Run Code Online (Sandbox Code Playgroud)
CSS
.pieChart {
height: 100px;
width: 100px;
float: left;
}
Run Code Online (Sandbox Code Playgroud)
我试着找几个小时的答案,但我甚至不确定我究竟需要搜索什么.我想出的唯一解决方案是更改pie-chart.js中的默认值,我不想这样做.
编辑
该应用程序是开源的,您可以在我的存储库中找到完整的代码:https://github.com/AndreasGassmann/cloudatcostapp
我有以下代码:
public obs$: Observable<boolean>
Run Code Online (Sandbox Code Playgroud)
public obs$: Observable<boolean>
Run Code Online (Sandbox Code Playgroud)
它可以按预期工作,但是if看起来有些冗长。
问题是我不能简单地做<div *ngIf="(obs$ | async)">。如果我尝试这样做,它将在observable尚未发出值或值为true的情况下起作用,但如果值为false则它将不起作用,因为if的结果为false且div不是显示。
我假设如果返回虚假值(例如空字符串或0),则会遇到相同的问题。
有没有更好,更轻松的方法呢?
我第一次尝试在我的节点应用程序中使用网络工作者或线程。我正在使用webworker-threads npm 模块。
基本上我希望每个工作人员向服务器发出请求,测量响应时间并将其发送回主线程。
我尝试了很多不同的方法,但我似乎无法让它发挥作用。文档中的基本示例有效。但是当我尝试要求一个模块(在我的例子中为“请求”)时,工作人员似乎停止工作,没有任何错误消息。我在文档中看到 require 在工作人员内部不起作用,所以我尝试了“importScripts()”,它也不起作用。使用线程池时,我尝试使用 .all.eval() 但它也不起作用。
由于这是第一次在节点中使用网络工作线程/线程,我可能会误解如何使用这些东西。这是我尝试过的一个例子:
服务器.js
var Worker = require('webworker-threads').Worker;
var worker = new Worker('worker.js');
Run Code Online (Sandbox Code Playgroud)
工人.js
console.log("before import");
importScripts('./node_modules/request/request.js');
console.log("after import");
Run Code Online (Sandbox Code Playgroud)
这个基本示例仅打印before import然后停止。
typescript ×4
angular ×3
ionic2 ×3
javascript ×3
cordova ×2
css ×2
node.js ×2
angularjs ×1
concurrency ×1
enums ×1
html ×1
ionic ×1
ionic3 ×1
module ×1
npm ×1
observable ×1
overlay ×1
overloading ×1
qr-code ×1
rxjs ×1
web-worker ×1