小编Chr*_*odz的帖子

如何使零数值算作真值?

在过去的几周里,我发现自己一遍又一遍地遇到同样的问题,那就是||如果未设置第一个值,则使用运算符分配默认值:

(myVariable || 'somestring')
Run Code Online (Sandbox Code Playgroud)

只要myVariable不是 a 0,这种方法就有效,但如果它是 a ,0那么就会出现问题,因为它将把它算作一个假值。这可以通过检查它是否为零来解决,但它很快就会变得难以阅读,例如(myVariable >= 0 ? myVariable : 'somestring').

myVariable允许存在0但仍算作真实值的最简单和最正确的方法是什么?请注意,它myVariable仍然必须是原始值,因此使用!!运算符将​​不起作用。

javascript operators

6
推荐指数
1
解决办法
2663
查看次数

如何在模糊功能之前执行点击功能

我有一个简单的问题,但我似乎无法找出任何解决方案.

基本上我有一个输入,在聚焦时切换下拉列表,当它不再聚焦时,它应该关闭下拉列表.

但问题是,如果单击下拉列表中的某个项目,该功能将在项目功能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)

angular

6
推荐指数
3
解决办法
3717
查看次数

Angular 2验证器未按预期工作

我有这个验证器:

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)

typescript angular2-formbuilder angular-validation angular

6
推荐指数
1
解决办法
7376
查看次数

如何在InteractiveViewer中使用GridView?

我正在尝试使用用于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' …

dart flutter

6
推荐指数
0
解决办法
500
查看次数

使用 Angularfire 时如何使 Firebase App Check 工作?

我正在尝试让 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 …

javascript firebase angularfire angular firebase-app-check

6
推荐指数
1
解决办法
940
查看次数

选择应该用于呈现路径内容的路由器插座

我有一个nav组件,它是一个处理一些路由切换的菜单,我遇到的问题是我似乎无法呈现路由的内容,因为我router-outletnav组件模板中没有.

相反,我想在我的主应用程序组件中呈现路径的内容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)

angular2-routing angular

5
推荐指数
1
解决办法
5995
查看次数

输入和输出,如何使用它们来遵循Angular 2的样式指南的命名约定?

在我知道更好之前,我曾经将我的指令定义为:

...
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)

javascript typescript angular2-styleguide angular

5
推荐指数
1
解决办法
1321
查看次数

Angular 2 - 如何使用 prerender.io 和延迟加载

由于 Angular Universal 在很长一段时间内都不会出现在 CLI 中,我必须使用 prerender.io 来让 SEO 正常工作。然而,经过一些测试,它似乎并没有那么好,因为它似乎没有等待延迟加载的模块,所以 SEO 仍然失败。

在他们这个位置的网站上,他们这样说:

您的页面是否仅部分呈现?

我们的 Prerender 服务器会尽力通过计算进行中的请求数来确定页面何时完成加载。一旦飞行中的请求数达到零,我们等待一小段时间,然后保存 HTML。如果这太早保存页面,您可以使用我们的 window.prerenderReady 标志通知服务器您的页面已准备好保存。

把它放在你的 HTML 中:

<script> window.prerenderReady = false; </script>
Run Code Online (Sandbox Code Playgroud)

当我们看到 window.prerenderReady 设置为 false 时,我们将等到它设置为 true 以保存 HTML。当您的页面准备就绪时(通常在 ajax 调用之后)执行此操作:

window.prerenderReady = true;
Run Code Online (Sandbox Code Playgroud)

这是我不明白如何去做的地方。由于 Angular 从模板中删除脚本标签(不确定这只是 CLI 行为还是 Angular 本身),我无法设置初始脚本标签。我也无法弄清楚如何从我的组件类更新模板脚本标签内的window属性prerenderReady,因为我不能只使用window.prerenderReady = true并期望它工作,因为必须将脚本添加到模板中。

有没有人设法解决这个问题或对我如何实现这一目标有任何想法?

javascript seo prerender typescript angular

5
推荐指数
1
解决办法
2125
查看次数

Nodejs - 普通回调与 exec

最近几天我一直在学习 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)

mongoose mongodb

5
推荐指数
1
解决办法
9908
查看次数

在两个 observables 的第一个值发出后,Zip 不会发出值

我正在尝试组合两个 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)

observable rxjs typescript behaviorsubject angular

5
推荐指数
1
解决办法
1090
查看次数