在过去的几周里,我发现自己一遍又一遍地遇到同样的问题,那就是||如果未设置第一个值,则使用运算符分配默认值:
(myVariable || 'somestring')
Run Code Online (Sandbox Code Playgroud)
只要myVariable不是 a 0,这种方法就有效,但如果它是 a ,0那么就会出现问题,因为它将把它算作一个假值。这可以通过检查它是否为零来解决,但它很快就会变得难以阅读,例如(myVariable >= 0 ? myVariable : 'somestring').
myVariable允许存在0但仍算作真实值的最简单和最正确的方法是什么?请注意,它myVariable仍然必须是原始值,因此使用!!运算符将不起作用。
我有一个简单的问题,但我似乎无法找出任何解决方案.
基本上我有一个输入,在聚焦时切换下拉列表,当它不再聚焦时,它应该关闭下拉列表.
但问题是,如果单击下拉列表中的某个项目,该功能将在项目功能blur之前执行click,导致该click功能根本无法运行,因为在注册单击之前下拉列表已关闭.
我怎么解决这个问题?
<input (focus)="showDropdown()" (blur)="myBlurFunc()">
<ul>
<li *ngFor="let item of dropdown" (click)="myClickFunc()">{{item.label}}</li>
</ul>
Run Code Online (Sandbox Code Playgroud) 我有这个验证器:
export const PasswordsEqualValidator = (): ValidatorFn => {
return (group: FormGroup): Observable<{[key: string]: boolean}> => {
const passwordCtrl: FormControl = <FormControl>group.controls.password;
const passwordAgainCtrl: FormControl = <FormControl>group.controls.passwordAgain;
const valid = passwordCtrl.value.password === passwordAgainCtrl.value.passwordAgain;
return Observable.of(valid ? null : {
passwordsEqual: true
});
};
};
Run Code Online (Sandbox Code Playgroud)
以这种形式使用:
public signupForm: FormGroup = this.fb.group({
email: ['', Validators.required],
passwords: this.fb.group({
password: ['', Validators.required],
passwordAgain: ['', Validators.required]
}, {validator: CustomValidators.passwordsEqual()})
});
Run Code Online (Sandbox Code Playgroud)
使用它的模板的一部分:
<div formGroupName="passwords">
<div class="form-control" [ngClass]="{error: !signupForm.get('passwords').valid}">
<label class="label" for="password">Password</label>
<input class="input" id="password" formControlName="password" type="password"> …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用用于InteractiveViewer平移/缩放的游戏地图,然后使用
GridView用于生成行和列的网格。这是我的build功能:
@override
Widget build(BuildContext context) {
return InteractiveViewer(
constrained: false,
transformationController: _transformationController,
child: GridView.count(
crossAxisCount: widget.map.columns,
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
children:
List.generate(widget.map.rows * widget.map.columns, (index) {
return Container(
width: 100,
height: 100,
decoration: BoxDecoration(
border: Border.all(width: 1, color: Colors.white)),
child: Text(index.toString()));
}),
));
}
Run Code Online (Sandbox Code Playgroud)
但是,当运行此代码时,我不断收到错误,例如:
在 PerformLayout() 期间抛出以下断言:'package:flutter/src/rendering/viewport.dart': 断言失败:第 1753 行 pos 16: 'constraints.hasBoundedWidth': 不正确。该断言要么表明框架本身存在错误,要么我们应该在此错误消息中提供更多信息,以帮助您确定并修复根本原因。无论哪种情况,请通过在 GitHub 上提交错误来报告此断言: https: //github.com/flutter/flutter/issues/new ?template=BUG.md 相关的导致错误的小部件是:GridView
RenderBox 未布局: RenderCustomPaint#078ce relayoutBoundary=up3 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE 'package:flutter/src/rendering/box.dart': 断言失败:第 1702 行 pos 12: 'hasSize' …
我正在尝试让 Firebase App Check 工作,但我正在努力寻找一种使用 Angularfire 来实现这一点的方法,因为我能找到的似乎没有相关文档。
...
import { getFirestore, provideFirestore } from '@angular/fire/firestore';
import { AngularFireModule } from '@angular/fire/compat';
import { AngularFireStorageModule } from '@angular/fire/compat/storage';
import { initializeAppCheck, provideAppCheck, ReCaptchaV3Provider } from '@angular/fire/app-check';
import { FirebaseApps, getApp } from '@angular/fire/app';
@NgModule({
...
imports: [
...
AngularFireModule.initializeApp(environment.firebase),
AngularFirestoreModule.enablePersistence(),
AngularFireStorageModule,
provideFirestore(() => getFirestore()),
provideAppCheck(() => initializeAppCheck(getApp(), { provider: new ReCaptchaV3Provider(environment.recaptchaSiteKey), isTokenAutoRefreshEnabled: true })),
],
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)
这样,当我运行应用程序时,我收到此错误:
NullInjectorError:R3InjectorError(AppModule)[AngularFireAuthGuard - > AngularFireAuth - > AppCheckInstances - > InjectionToken …
我有一个nav组件,它是一个处理一些路由切换的菜单,我遇到的问题是我似乎无法呈现路由的内容,因为我router-outlet在nav组件模板中没有.
相反,我想在我的主应用程序组件中呈现路径的内容core,但是如何告诉angular使用router-outlet我的core组件而不是我的nav组件?
因为我[routerLink]在这个模板里面:
nav.component.html:
<nav class="nav-wrapper" [class.is-toggled]="isToggled" [class.is-hidden]="!isToggled">
<ul class="nav-links">
<li class="nav-link" *ngFor="#link of links">
<a [routerLink]="link.href">
<div class="label-wrapper">{{link.label}}</div>
<div class="icon-wrapper"><i class="{{link.icon}}"></i></div>
</a>
</li>
</ul>
</nav>
Run Code Online (Sandbox Code Playgroud)
它不想将路由呈现到core组件中:
core.component.html:
<!-- The menu -->
<nav-list></nav-list>
<!-- The router-outlet which should render the videos component -->
<router-outlet></router-outlet>
Run Code Online (Sandbox Code Playgroud)
videos.component.html:
<h1>My videos</h1>
<!-- This should render the child views of the videos component --> …Run Code Online (Sandbox Code Playgroud) 在我知道更好之前,我曾经将我的指令定义为:
...
inputs: [
'onOutside'
]
...
export class ClickOutsideDirective {
@Output() onOutside: EventEmitter<any> = new EventEmitter();
}
Run Code Online (Sandbox Code Playgroud)
但后来我读了样式指南,它说你不应该在输出前加上,on因为Angular 2支持on-模板中的语法.
所以我试图将其改为:
@Input() outsideClick: any;
@Output() outsideClick: EventEmitter<any> = new EventEmitter();
Run Code Online (Sandbox Code Playgroud)
但是,如果不允许使用前缀,我发现很难将@Input名称与Output名称分开on.
在你可以命名@Input和@Output同一个东西之前,如果在导出的类中声明两者,那么这将不再有效,因为将抛出错误.
如果我将@Inputto outside和@Outputto 命名为outsideClick,那它就没有意义,因为它们都是同一个东西.outside是我想在调用时执行的函数outsideClick.
而且,outsideClick如果outside不再是同名的话,也不会知道要执行什么,或者我错过了什么?
我应该如何在这里命名@Input和@Output变量,以便它仍然有效,并且与第一个例子中的一样有意义?
编辑:
用法示例:
<div clickOutside [exceptions]="['.toggler']" (outside)="doSomethingOnOutsideClick()"></div>
Run Code Online (Sandbox Code Playgroud) 由于 Angular Universal 在很长一段时间内都不会出现在 CLI 中,我必须使用 prerender.io 来让 SEO 正常工作。然而,经过一些测试,它似乎并没有那么好,因为它似乎没有等待延迟加载的模块,所以 SEO 仍然失败。
在他们这个位置的网站上,他们这样说:
您的页面是否仅部分呈现?
我们的 Prerender 服务器会尽力通过计算进行中的请求数来确定页面何时完成加载。一旦飞行中的请求数达到零,我们等待一小段时间,然后保存 HTML。如果这太早保存页面,您可以使用我们的 window.prerenderReady 标志通知服务器您的页面已准备好保存。
把它放在你的 HTML 中:
Run Code Online (Sandbox Code Playgroud)<script> window.prerenderReady = false; </script>当我们看到 window.prerenderReady 设置为 false 时,我们将等到它设置为 true 以保存 HTML。当您的页面准备就绪时(通常在 ajax 调用之后)执行此操作:
Run Code Online (Sandbox Code Playgroud)window.prerenderReady = true;
这是我不明白如何去做的地方。由于 Angular 从模板中删除脚本标签(不确定这只是 CLI 行为还是 Angular 本身),我无法设置初始脚本标签。我也无法弄清楚如何从我的组件类更新模板脚本标签内的window属性prerenderReady,因为我不能只使用window.prerenderReady = true并期望它工作,因为必须将脚本添加到模板中。
有没有人设法解决这个问题或对我如何实现这一目标有任何想法?
最近几天我一直在学习 nodejs,我偶然发现了一些我找不到任何好的解释的东西。
基本上它exec与普通回调有关,即(err, res) => {},如下所示:
Product.find({}).exec((err, products) => {});
Product.find({}, (err, products) => {});
Run Code Online (Sandbox Code Playgroud)
我找到了更多使用 的示例exec,但是当我阅读有关内容时,我exec真的不明白为什么。他们似乎都在对我做同样的事情。
所以,我的问题是,我应该使用一个而不是另一个,如果是,为什么?
编辑:
只是为了清楚Product起见,是 MongoDB 模型/模式。像这样:
const Product = mongoose.model('Product', new Schema({
title: {type: String, default: ''},
description: {type: String, default: ''},
price: {type: Number, default: ''}
}));
Run Code Online (Sandbox Code Playgroud) 我正在尝试组合两个 observable,一个是路由参数,另一个是自定义的。
我正在使用,zip因为forkJoin似乎不起作用。但是 zip 表现得很奇怪,因为当我发出自定义的 zip 时,我没有得到那个值。我只得到第一个空值,该值已BehaviorSubject作为默认发出值提供给我。
我读了这个
“zip 操作符将订阅所有内部 observable,等待每个内部 observable 发出一个值。一旦发生这种情况,将发出具有相应索引的所有值。这将一直持续到至少一个内部 observable 完成。”
这是否意味着它不会响应直到两个 observable 都发出一个值?因为路由参数 observable 只会发出一次,但dataEmitter会继续发出值。在这种情况下使用的正确运算符是什么?
这是我的一些代码:
我的服务中的发射器:
private dataEmitter: BehaviorSubject<any> = new BehaviorSubject<any>(null);
Run Code Online (Sandbox Code Playgroud)
组件订阅,只null从 获取dataEmitter,从不this.calculatedData:
Observable.zip(this.route.params, this.dataCalculator.dataEmitter$)
.subscribe(data => console.log(data));
Run Code Online (Sandbox Code Playgroud)
当所有计算完成后调用:
this.dataEmitter.next(this.calculatedData);
Run Code Online (Sandbox Code Playgroud) angular ×7
javascript ×4
typescript ×4
angularfire ×1
dart ×1
firebase ×1
flutter ×1
mongodb ×1
mongoose ×1
observable ×1
operators ×1
prerender ×1
rxjs ×1
seo ×1