我正在使用WebStorm进行Angular 2项目.
我在TypeScript和我使用的一个组件中编写代码Observable:
import { Observable } from "rxjs/Rx";
import 'rxjs/Rx';
@Component({...})
export class SearchComponent {
@ViewChild('input') input: ElementRef;
ngAfterViewInit() {
let inputElement = this.input.nativeElement;
let keyups = Observable.fromEvent(inputElement, 'keyup'); // <-- WebStorm error
keyups.subscribe(data => console.log(data));
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码确实有效(每次在输入字段中输入内容时都会记录到控制台),但WebStorm会抱怨该fromEvent方法("未解析的函数或方法").
此外,如果我在Observable类上触发自动完成,则缺少RxJS文档中列出的大多数运算符.例如,打字Observable.fr应该产生的名单from,fromCallback,fromEvent,fromPromise...但WebStorm只表明一种方法(withLatestFrom).
如何在WebStorm中为可观察对象获得正确的自动完成/ TypeScript支持?
我曾尝试不同的方式导入Observable,我已经试过的建议在这篇文章中(即添加"files": ["node_modules/rxjs/Rx.KitchenSink.d.ts"]到tsconfig.json),但毫无效果.
我有一个AngularJS单页面应用程序显示3个视图(实际上是3个指令).为了说明我的问题,让我们假设我的UI与GMail的UI相同,我的3个视图是:
每当路径发生变化时,这3个视图都需要自我更新.例如:
在AngularJS中执行此操作的最佳方法是什么?
到目前为止,我有:
$routeProvider只支持一个视图ngView.这种作品,但我有几个问题:
我需要注意路径更改的代码(我把它放在服务中或控制器中):
var watchExpression = function() { return $location.path(); };
var listener = function(newPath, oldPath) {
// Broadcast event on $rootScope
$rootScope.$broadcast('PathChanged', newPath);
};
$rootScope.$watch(watchExpression, listener);
Run Code Online (Sandbox Code Playgroud)
然后,在视图控制器中,我捕获事件:
$scope.$on('PathChanged', function(event, …Run Code Online (Sandbox Code Playgroud) 我有一个NgModule位于/src文件夹外部的Angular CLI项目(最终这个NgModule将打包为npm模块,但现在我只是把它留在了外面/src).
我正在尝试为这个NgModule编写单元测试,但ng test似乎没有拾取.spec.ts文件/src夹之外的文件.
我试过改变路径/src/test.ts:
// Original
const context = require.context('./', true, /\.spec\.ts$/);
// Does not work
const context = require.context('../', true, /\.spec\.ts$/);
// Does not work
const context = require.context('/absolute/path/to/ngmodule', true, /\.spec\.ts$/);
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误: Module build failed: Error: /absolute/path/to/file.spec.ts is not part of the compilation. Please make sure it is in your tsconfig via the 'files' or 'include' property.
我也尝试在以下include属性中添加我的NgModule路径tsconfig.spec.json:
"include": [ …Run Code Online (Sandbox Code Playgroud) 只要承诺尚未解决,我想阻止访问路由.另外,我想将该promise的返回值传递给路由组件.
SO上的几个帖子建议使用这个OnActivate接口.该文件说:"如果routerOnActivate返回一个承诺,路线变化将等到承诺平息实例化和启动子组件 ".听起来很完美,只有路线仍然会立即激活...(是因为它是Route2 的子组件会等待承诺,而不是Route2组件本身??)
请参阅https://plnkr.co/edit/ipKrOgfRj0vKk8ZejH5v?p=preview.Route2组件实现了OnActivate接口,但是当您单击Route2链接时,会立即激活Route2组件.但是,URL /route2仅在承诺解决后才会更新.(在一个单独的窗口中启动Plunker以查看我的意思.)现在我不太关心URL,在解决promise之前,Route2组件根本不应该实例化.
我的另一个策略是使用@CanActivate装饰器.它更适合我的目的,"路由器调用它来确定组件是否可以实例化为导航的一部分".
这里的问题是如何将数据从@CanActivate装饰器中的promise传递给组件?
我看到人们将他们的数据写入next装饰器参数的属性,并next在routerOnActivate方法的参数中检索它.
例如在next.params(这里):
@CanActivate((next) => {
return messageService.getMessage()
.then((message) => {
next.params.message = message;
return true;
});
})
export class MyComponent implements OnActivate {
routerOnActivate(next) {
this.message = next.params.message;
}
}
Run Code Online (Sandbox Code Playgroud)
或者next.routeData.data(在这里).
但是文档 …
我有一个表单,用户可以在文本区域中输入 markdown 格式的文本。我想展示一个准实时预览在字段旁边显示解析后的降价
与 StackOverflow 问题表单完全相同。;-)
文本区域的值是通过 RxJS Observable 发出的,但我不想刷新每个新值的预览。相反,我只想在用户停止输入 500 毫秒后刷新预览刷新预览。
这是一个暂定图(第一行是用户键入时文本区域发出的原始值,第二行是我想要获得的值;只有在经过了没有发射的特定延迟后才发出值):
t---t--ttt------tt-ttt------t---|
----------------t-----------t---|
Run Code Online (Sandbox Code Playgroud)
实现此目的的语法是什么?
有谁知道为什么链接#1和#2工作但链接#3不工作?
<a [routerLink]="['/contact']">Contact Solo</a> |
<a [routerLink]="[{ outlets: { aux: 'aside' }}]">Aux Solo</a> |
<a [routerLink]="['/contact', { outlets: { aux: 'aside' }}]">Contact + Aux</a>
<router-outlet></router-outlet>
<router-outlet name="aux"></router-outlet>
Run Code Online (Sandbox Code Playgroud)
换句话说:我可以单独激活主路由(链路#1),我可以单独激活辅助路由(链路#2),但我不能同时激活主路由和辅助路由(链路#3).链接#3仅激活主路由,但在控制台中不会触发错误.
有趣的是,单击链接#1然后链接#2产生我想要的(主路由和辅助激活)与路径,contact(aux:aside)而链路#3具有路径contact/(aux:aside)(注意/).
Plunkr:https://plnkr.co/edit/WqTRjux7muHjalIL3rsL ? p = preview
路线声明:
const appRoutes: Routes = [
{
path: 'contact',
component: ContactComponent,
},
{
path: 'aside',
component: PopupComponent,
outlet: 'aux'
}
];
Run Code Online (Sandbox Code Playgroud)
我尝试了多种组合和语法无济于事.
有谁知道如何在自定义字段的类中声明ASYNC验证方法?
现在我在方法中有一个同步验证器validate():
@Component({
selector: 'my-field',
template: `<p>Some markup</p>`,
providers: [
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MyFieldComponent), multi: true },
{ provide: NG_VALIDATORS, useExisting: forwardRef(() => MyFieldComponent), multi: true }
]
})
export class MyFieldComponent implements ControlValueAccessor {
validate(c: FormControl) {
// return null or error
}
// Rest of the code omitted for brevity
// writeValue(), registerOnChange()...
}
Run Code Online (Sandbox Code Playgroud)
但即使我NG_ASYNC_VALIDATORS使用与上面相同的语法添加到提供程序,它也不会让我声明类似于validateAsync()方法的东西.
除非......两种类型的验证器都以该validate()方法为目标,我需要在此方法中同时执行同步和异步验证,并返回一个大的observable(可能包含多个错误键)?我对此不太确定.
侧面注意:我可以开始工作的是直接在提供者中 …
假设我想{{ }}在Angular 2+模板中显示以下字符串 - 包括- :
Hello {{name}}, how are you?"
Run Code Online (Sandbox Code Playgroud)
NB.整个字符串将是硬编码的,它不会来自变量.
什么是逃避花括号的最佳方法,以便它们不被视为插值?
我有一些有用的东西,但它看起来不是很干净:
Hello {{ '{{' }}name}}, how are you?
Run Code Online (Sandbox Code Playgroud) angular ×6
rxjs ×2
angular-test ×1
angularjs ×1
javascript ×1
rxjs5 ×1
typescript ×1
webstorm ×1