我正在尝试将我的应用程序从Angular v5迁移到v6,并且在尝试providedIn
在我的提供程序中指定时遇到以下打字稿错误
参数类型{providedIn:"root"}不能赋予参数类型{providedIn:Type | "根"| null}&InjectableProvider
@Injectable({
providedIn: 'root',
})
export class MyService {
}
Run Code Online (Sandbox Code Playgroud)
我复制并粘贴了Angular文档https://angular.io/guide/dependency-injection中的代码
任何的想法?
UPDATE
我创建了一个空白项目ng new ...
并添加了一个提供程序ng g service my-new-service
,在WebStorm中打开了项目,一切正常,我没有遇到任何关于该虚拟项目的错误
UPDATE
我联系了WebStorm支持,结果发现这是WebStorm的一个已知错误https://youtrack.jetbrains.com/issue/WEB-32634
UPDATE
Webstorm 2018.1.4(尚未发布)应解决此问题,请参阅https://youtrack.jetbrains.com/issue/WEB-32634
UPDATE
Webstorm团队将修复程序移至2018.1.5
UPDATE
2018年6月17日星期日,Webstorm修复程序已经发布
任何人都知道如何从ionic2中的后历史(或导航堆栈)中删除视图?
在Ionic 1中,我解决了这个问题
this.$ionicHistory.nextViewOptions({
disableAnimate: true,
disableBack: true
});
Run Code Online (Sandbox Code Playgroud)
例如,在执行成功登录后从历史记录中完全删除应用程序的登录页面将非常有用.
在这种情况下,只是没有显示后退按钮是不够的,因为Android终端在设备上有自己的物理后退按钮.
我尝试了,在我的登录功能返回成功的承诺之后,在推送堆栈中的下一页之前:
this.navController.pop();
Run Code Online (Sandbox Code Playgroud)
要么
this.navController.remove(this.viewCtrl.index);
Run Code Online (Sandbox Code Playgroud)
但不幸的是两个都没有成功:(
我正在尝试将Angular Universal项目从Angular v5迁移到v6
我有一个服务,我用它fs
来加载服务器端的翻译.一切都适用于Angular v5.
使用Angular v6,当我运行npm run start
aka ng serve --proxy-config proxy.conf.json
我面临以下错误
./src/providers/core/translate/translate-universal-loader.service.ts中的错误找不到模块:错误:无法解析'/ Users/me/Documents/projects/myproject/src/providers中的'fs' /核心/翻译"
在我的服务中,我声明fs
如下:
declare var require: any;
const fs = require('fs');
Run Code Online (Sandbox Code Playgroud)
我也试图宣布它像跟随,但没有帮助
import * as fs from 'fs';
Run Code Online (Sandbox Code Playgroud)
告诉webpack忽略fs我试图在我的webpack.server.config.js
成功中添加以下内容
node: {
fs: 'empty'
}
Run Code Online (Sandbox Code Playgroud)
还尝试了一个webpack插件,但也没有成功
new webpack.IgnorePlugin(/fs/)
Run Code Online (Sandbox Code Playgroud)
但实际上它可能不是配置使用ng serve
但我不知道我是否仍然可以用v6弹出配置?
有谁有想法?
UPDATE
如果我声明fs因为any
它解决了问题ng serve
但不幸的是它在服务器端npm run build:ssr
运行后无法运行npm run serve
.在服务器端,我将面临以下错误
错误ReferenceError:未定义fs
ps:我的项目遵循https://github.com/angular/universal-starter结构,配置和依赖项
在以前版本的 Firebase 中,我使用以下方式导入 Typescript 定义User
:
import {User} from 'firebase';
Run Code Online (Sandbox Code Playgroud)
在引入v8之后,此导入不再起作用:
模块“../../../../node_modules/firebase”没有导出成员“用户”。您的意思是使用“从“../../../../node_modules/firebase”导入用户吗?
该发行说明点的事实CJS束被放弃了,但是,并没有提及如何进口,现在应该解决。
任何帮助表示赞赏,在此先感谢您。
我按照一些教程如http://www.html5rocks.com/en/tutorials/frameworks/angular-websockets/在我的node.js服务器和angular.js客户端实现socket.io,一切正常.
但是,客户端,Typescript显示以下编译错误:
TS2496: The 'arguments' object cannot be referenced in an arrow function in ES3 and ES5. Consider using a standard function expression.
Run Code Online (Sandbox Code Playgroud)
关于以下服务代码:
on(eventName:string, callback) {
this.socket.on(eventName, () => {
var args = arguments; // <-- here the compilation error
this.$rootScope.$apply(() => {
callback.apply(this.socket, args);
});
});
}
emit(eventName:string, data, callback?) {
this.socket.emit(eventName, data, () => {
var args = arguments; // <-- here the compilation error
this.$rootScope.$apply(() => {
if (callback) {
callback.apply(this.socket, args);
}
}); …
Run Code Online (Sandbox Code Playgroud) 现在,使用Angular v5,同时使用延迟加载,我加载app.module.ts
我认为不是最佳策略的所有提供者,因为这不会加快我的应用程序启动时间,特别是因为我有50个自定义的东西提供者(不要评判我;)).
因此,我问我自己是否应该为我的所有应用程序加载所有这些应用程序,或者我是否应该只在我只使用它们的地方加载它们?
我猜测只在我真正使用它们的地方加载提供商会更好.
但在这种情况下,对我而言根本不清楚如何解决以下构造:
假设我有三个页面(A,B和C),它们有自己的模块和三个提供程序(1,2和3).
A use 1
B use 1, 2, 3
C use 1, 2
Run Code Online (Sandbox Code Playgroud)
我想,因为1是在所有应用程序中使用,我将不得不声明它 app.module.ts
由于3只在B页中使用,我想我只需要声明它 B.module.ts
但是2呢?我怎么能在两者中声明它B.module.ts
并且C.module.ts
目标是共享相同的提供者"内存"(如果提供者包含一个值,B和C应该看到相同的对象),我将分别如何编码?只需通过"像往常一样"注入提供者并完成剩下的角度吗?
提前获得任何帮助,真的很感激
UPDATE
不确定我是否正确理解了角度文档,但这是目标,应该为所有应用程序加载提供程序吗?
看到
https://angular.io/guide/ngmodule-faq#q-component-scoped-providers
更新2018年
注入策略随着Angular v6的引入而发展.根据文档,可以providedIn
指定应该使用服务的模块.请参阅https://angular.io/guide/dependency-injection
在cordova-android 6.3.0(https://cordova.apache.org/announcements/2017/09/27/android-release.html)的发行说明中,记下cordova-plugin-compat
了必须删除的内容
如果我试试
cordova plugin rm cordova-plugin-compat
Run Code Online (Sandbox Code Playgroud)
我得到以下错误
[错误]运行cordova插件时发生错误删除cordova-plugin-compat --save(退出代码1):
错误:插件'cordova-plugin-compat'需要(cordova-plugin-calendar,cordova-plugin-camera,cordova-plugin-file,cordova-plugin-geolocation),跳过卸载.(如果尝试更新,请尝试--force)
如果我然后尝试--force
删除,它的工作,插件被删除,我能够构建我的Android应用程序.
但是,我刚刚删除了我的iOS
平台再次添加它,我现在面对错误
cordova准备ios错误:找不到插件"cordova-plugin-compat"的plugin.xml.请尝试重新添加.
[错误]运行cordova prepare ios时出错(退出代码1).
知道我做错了什么吗?应该真的cordova-plugin-compat
被删除?为什么我的iOS平台引用它,我以为它只适用于Android?
我使用cordova-android@6.3.0和cordova-ios@4.5.1
PS:如果我删除并添加iOS平台,compat插件会自动添加为package.json和package-lock.json中的参考
UPDATE
最后一个插件发布(https://cordova.apache.org/news/2017/11/10/plugins-release.html)最有可能分别解决这个问题,看起来问题是cordova-plugin-compat
从其他插件引用插件.但,
我还没有完全测试它并解决它,因为我正在使用另一个插件,其中也引用了compat(https://github.com/EddyVerbruggen/Calendar-PhoneGap-Plugin/issues/426).
我将保持这个线程打开,直到我能100%确认这解决了compat的引用.
最终更新
从Calendar-PhoneGap-Plugin
'cordova-plugin-compat' 删除依赖关系的PR 通过,我能够删除这个最后一个插件没有"强制"
我注意到我在iOS v12上的Ionic Angular应用程序发出的https请求分别无法到达我的后端.
我可以确认我的应用程序是高效的,而且这个错误只发生在iOS> = v12上
当我在Xcode 10 beta中调试时,我收到以下错误
{"headers":{"normalizedNames":{},"lazyUpdate":null,"headers":{}},"status":0,"statusText":"未知错误","url":null,"ok ":false,"name":"HttpErrorResponse","message":"(未知网址)的Http失败响应:0未知错误","错误":{"isTrusted":true}}
My Node/Express.js后端设置以下标头
var allowedOrigins = ["https://example.com", "http://ionic.local", "http://localhost:8080"];
var origin = req.headers.origin;
if(allowedOrigins.indexOf(origin) > -1){
res.setHeader('Access-Control-Allow-Origin', origin);
} else {
res.setHeader("Access-Control-Allow-Origin", "https://example.com");
}
res.header("Access-Control-Allow-Credentials", "true")
res.header("Access-Control-Allow-Headers", "Origin, Authorization, Content-Type, Content-Range, Content-Disposition, Content-Description, X-Requested-With, X-ACCESS_TOKEN");
res.header("Access-Control-Allow-Methods", "GET,PUT,POST");
Run Code Online (Sandbox Code Playgroud)
任何人都面临同样的问题?您在代码中更改了什么来修复iOS v12的问题?
PS:我已经向Apple提出了一个问题
这里也是Ionic论坛上的链接主题:https://forum.ionicframework.com/t/ios-12-beta-preflight-requests-fail
以防万一在WkWebView插件上打开一个问题:https://github.com/ionic-team/cordova-plugin-ionic-webview/issues/112
UPDATE
我不确定,但看起来我只是在查询POST请求时遇到问题,我在执行GET请求时没有面对它...你能否确认一下?
更新2
在下面的讨论/问题中,https://github.com/ionic-team/cordova-plugin-ionic-webview/issues/112,我们也在押注iOS版本中的一个错误.让我们看看它是否会在下一个beta版本中得到纠正
更新3
Xcode 10 beta 2
iOS 12 beta 2
2018年6月19日星期二分别解决了我的问题
我曾经为我的angular2 http帖子设置超时,如下所示:
this.http.post('myurl',
body, {headers: headers})
.timeout(2000, new Error('Timeout exceeded'))
.map(res => res.json())
.subscribe((stuff) => {
//Do stuff
}, (errorResponse: any) => {
//Manage error
});
Run Code Online (Sandbox Code Playgroud)
但是对于最新版本的Rjxs(5.0.1),这已经不再有效了.
超时需要一个Observable作为第一个参数,并且不接受"新错误",我该怎么做/写那个?
请您提前寻求帮助
注意:当我删除"new Error(...)"时,我的代码有效,但在运行时,我将面临以下错误
错误:未捕获(在承诺中):TypeError:_this.http.post(...).timeout不是函数TypeError:_this.http.post(...).timeout不是函数
作为离子角3.9.0发行说明(https://github.com/ionic-team/ionic/blob/master/CHANGELOG.md)中的状态,利用更新到RXJS 5.5.2的优势可以减少捆绑大小因此导致更快的启动时间
酷,酷,酷:)
例如Ionic提供的迁移示例debounceTime
非常清楚,我明白了.
但是我很不清楚我应该如何更新以下代码以充分利用这个RXJS更新.
任何人都可以帮助我转换它或如何更好地编写它以保存包大小的目标?
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/empty';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/catch';
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(req).do((event: HttpEvent<any>) => {
if (event instanceof HttpResponse) {
// do stuff with response if you want
}
}).catch((err: HttpErrorResponse) => {
if ((err.status == 400) || (err.status == 401)) {
this.interceptorRedirectService.getInterceptedSource().next(err.status);
return Observable.empty();
} else {
return Observable.throw(err);
}
})
}
Run Code Online (Sandbox Code Playgroud)
PS:链接的帖子https://forum.ionicframework.com/t/how-to-better-catch-do-empty-with-rxjs-5-5-2-updates/111559