我用的是angluar4 http,比如登录请求服务器,当我点击按钮提交表单时,谷歌浏览器的网络捕获了两个请求,其中一个是zone.js: 2744
(返回数据错误)。
为什么有两次?
我的代码参考在这里?https://angular.cn/tutorial/toh-pt6
1
2
3
我有一个 GPS 插件,可提供角度区域之外的位置。因此,angular 不会检测到这些变化,并且视图会保持相同的值。
当然,我可以从控制器订阅这个 observable 并做类似的事情。
$mySourceOutOfZone.subscribe((value)=>{
this.zone.run(() => {
this.value = value;
});
})
Run Code Online (Sandbox Code Playgroud)
视图将简单地使用如下值:
<span>{{value}}</span>
Run Code Online (Sandbox Code Playgroud)
但我想避免必须订阅控制器并使用命令式风格的方式。
我怎么能让这个 observable 在一个角度区域内运行?
我已经在 Angular 中创建了项目并使用内容编辑器添加到 SharePoint 页面中。
直到昨天它都可以正常工作。但它在加载页面时抛出以下错误。
zone-evergreen.js:42 Uncaught Error: Zone already loaded.
at zone-evergreen.js:42
at Object.pDpN (zone-evergreen.js:635)
at __webpack_require__ (bootstrap:79)
at Module.hN/g (polyfills.ts:1)
at __webpack_require__ (bootstrap:79)
at Object.1 (polyfills.js?v=1.0:10)
at __webpack_require__ (bootstrap:79)
at checkDeferredModules (bootstrap:45)
at Array.webpackJsonpCallback [as push] (bootstrap:32)
at polyfills.js?v=1.0:1
main.ts:12 TypeError: Zone.assertZonePatched is not a function
at new NgZone (core.js:28352)
at getNgZone (core.js:29222)
at PlatformRef.bootstrapModuleFactory (core.js:29104)
at core.js:29162
Run Code Online (Sandbox Code Playgroud)
我有一个Angular 4.3 + Cordova应用程序,以前工作得很好.但现在,我在应用启动时出现了一个空白屏幕,没有任何事情发生.
经过一段时间的挖掘,我意识到它的来源:
我的主页受到保护的保护,该CanActivate
保护将检查一些文件系统持久化的首选项,并将用户重定向到另一个页面(如果这是第一次运行或缺少必需的首选项),以填写所需的属性.
所以应用程序的推出取决于我的CanActivate
后卫,这取决于我PreferenceService
自己取决于FileSystemService
我自己实现的.问题是当我尝试读取存储用户首选项的文件时,没有触发单个回调,没有任何反应,甚至没有错误.
这是我的一部分FileSystemService
失败没有任何错误:
read(file: FileEntry, mode: "text" | "arrayBuffer" | "binaryString" | "dataURL" = "text"): Observable<ProgressEvent> {
return this.cdv.ready.flatMap(() => {
return Observable.create(observer => {
file.file(file => {
let reader = new FileReader();
reader.onerror = (evt: ErrorEvent) => {
this.zone.run(() => observer.error(evt)); //never triggered
};
reader.onload = (evt: ProgressEvent) => {
this.zone.run(() => observer.next(evt)); //never trigerred
};
switch (mode) {
case "text":
reader.readAsText(file); …
Run Code Online (Sandbox Code Playgroud) 我使用的角度4.3.1
和zone.js
0.8.14
与我跑我的测试,与karma
和webpack
和跨在我的测试中这个奇怪的错误来了,每当我使用fakeAsync
并勾选与时间相关的测试。
测试用例:
it('should call the function which is given as parameter', fakeAsync(() => {
autoRefreshService.start();
expect(spyFn).not.toHaveBeenCalled();
tick(1);
expect(spyFn).toHaveBeenCalled();
}));
Run Code Online (Sandbox Code Playgroud)
测试调用文件:
require('core-js/es6');
require('core-js/es7/reflect');
require('zone.js/dist/zone');
require('zone.js/dist/long-stack-trace-zone');
require('zone.js/dist/proxy');
require('zone.js/dist/sync-test');
require('zone.js/dist/jasmine-patch');
require('zone.js/dist/async-test');
require('zone.js/dist/fake-async-test');
import { TestBed } from '@angular/core/testing';
import {
BrowserDynamicTestingModule,
platformBrowserDynamicTesting,
} from '@angular/platform-browser-dynamic/testing';
TestBed.initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting());
const context = (require as any).context('./', true, /\.spec\.ts$/);
context.keys().map(context);
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
Chrome 59.0.3071 (Mac OS X 10.12.5) CallbackRepeaterService start should not start if no callback set …
Run Code Online (Sandbox Code Playgroud) Pascal Precht 写了一篇关于 Angular 变化检测的精彩文章。虽然我知道 zone.js 和虚拟 DOM 是完全不同的概念,但 Angular 的 zone.js 相当于 React 的虚拟 DOM 吗?如果是,主要区别是什么,如果否,请简要说明原因。
angular ×6
zone.js ×6
cordova ×1
filereader ×1
http ×1
jasmine ×1
reactjs ×1
rxjs ×1
sharepoint ×1
virtual-dom ×1
webpack ×1