当我显式渲染Recaptcha v2然后在从DOM中删除它之前重置它,大约40秒后我在浏览器控制台中出错.
我有一个可以用来重现问题的JSFiddle.
这是相关的代码摘录:
const recaptchaHolder = document.getElementById('...');
const recaptchaWidgetId = grecaptcha.render(recaptchaHolder, {/*...*/});
// then later
grecaptcha.reset(recaptchaWidgetId);
recaptchaHolder.parentElement.removeChild(recaptchaHolder);
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
未知(承诺)超时
使用以下stacktrace(实际的堆栈跟踪可能会有所不同,因为它发生在严重缩小的代码中):
setTimeout (async)
J @ recaptcha__en.js:100
(anonymous) @ recaptcha__en.js:285
tb @ recaptcha__en.js:284
mj @ recaptcha__en.js:456
(anonymous) @ recaptcha__en.js:458
Run Code Online (Sandbox Code Playgroud)
我试图利用文档中的'error-callback'
参数来捕获此错误,但这没有帮助 - 错误仍未被捕获,并且不会调用此回调.
另一个观察:如果我grecaptcha.reset
在从DOM中删除元素之前省略调用,则不会发生错误.但是,它可能会导致UI不一致:如果用户受到recaptcha的挑战(例如,使用图像),并且只是从DOM中删除元素而不调用grecaptcha.reset
,则不会从DOM中清除挑战HTML.
我正在寻找处理上述错误或以不同方式处理recaptcha删除的方法(如果我现在做错了)
正如在这个plunker中所看到的,我正在动态地向我的一个元素添加一个HTML,其归结为:
@Component({
selector: 'my-comp',
template: `<span [innerHTML]="link"></span>`,
}) export class MyComponent {
private linkContent = '<a routerLink="/my-route">GoTo Route</a>';
private link;
constructor(sanitizer: DomSanitizer) {
this.link = sanitizer.bypassSecurityTrustHtml(linkContent);
}
}
Run Code Online (Sandbox Code Playgroud)
这导致<a routerLink="/my-route">GoTo Route</a>
被添加到DOM中,但Angular routerLink
对该元素的指令一无所知,也没有"绑定"它.因此,当您单击该链接时,它会导致完全重新加载并重新引导(在plunk中不起作用,它只给出404).
问题:如何告诉角度通过DOM(或其部分,甚至是单个元素)并在需要时执行组件初始化?
我找到了关于这个主题的这篇文章并尝试了以下内容:
public class FailerAttr : Attribute {
public FailerAttr(string s) {
throw new Exception("I should definitely fail!");
}
}
Run Code Online (Sandbox Code Playgroud)
在单元测试项目中,我有以下内容:
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class Test {
[TestMethod]
public void GoFail() {
// Make sure attribute will get initialized
new Failer();
}
private class Failer {
[FailerAttr("")]
public int Prop { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,它会成功.所以,问题是:
一些环境信息(以防万一相关):
我正在尝试关注这个Github教程:https://www.youtube.com/watch?v = 73I5dRucCds 当我尝试将目录更改为我的桌面时,我在我的Git Shell中得到了这个:
Natha_000@idea-PC MINGW64 ~
$ cd /desktop
bash: cd: /desktop: No such file or directory
Natha_000@idea-PC MINGW64 ~
$ cd /Desktop
bash: cd: /Desktop: No such file or directory
Natha_000@idea-PC MINGW64 ~
$ cd Desktop
bash: cd: Desktop: No such file or directory
Natha_000@idea-PC MINGW64 ~
$ cd Documents
bash: cd: Documents: No such file or directory
Natha_000@idea-PC MINGW64 ~
$ cd /c/Desktop
bash: cd: /c/Desktop: No such file or directory
Natha_000@idea-PC MINGW64 …
Run Code Online (Sandbox Code Playgroud) 我async
在ngFor中使用管道来观察Observable.Observable由访问我的服务器的服务创建,并且在枚举ngFor循环时的加载时间,服务正确地调用服务器.
现在对于我不理解的部分:当任何结果回来时,一切都按预期发生.但是,如果服务器响应说,404,并且没有可用于枚举的结果,则async
管道会使服务继续触发请求,相隔毫秒.这显然不好.这里的设计期望是什么?如何优雅地处理在使用异步管道时返回错误的Observable?
在组件模板中:
<li *ngFor="let person of persons | async">{{person.id}}</li>
Run Code Online (Sandbox Code Playgroud)
在Component主体中:
get persons: Observable<Person[]> {
return this.personService.list();
}
Run Code Online (Sandbox Code Playgroud)
在服务中:
list(): Observable<Person[]> {
if (this.persons && this.persons.length) {
return Observable.from([this.persons]);
} else {
return this.http.get('/person')
.map((response: Response) => response.json())
.map((data: Person[]) => {
this.persons = data;
return data;
})
.catch((error: any) => {
let errMsg = "some error..."
return Observable.throw(errMsg);
});
}
}
}
Run Code Online (Sandbox Code Playgroud) 首先,Plunker中提供了所有代码.
我有一个根Angular2组件,如下所示:
import {Component} from '@angular/core'
@Component({
selector: 'my-app',
template: `
<h2>Angular2 Root Component</h2>
<div data-dynamic-content></div>
`,
})
export class App {}
Run Code Online (Sandbox Code Playgroud)
该[data-dynamic-content]
元素是我将在运行时添加的组件的占位符.这些组件也是动态的,创建如下:
import {Component} from '@angular/core'
export function createComponent(selector: string, value: string) {
@Component({
selector: selector,
template: `<h4>Dynamic Component: {{v}}</h4>`,
})
class MyDynamicComponent {
v = value;
}
return MyDynamicComponent;
};
Run Code Online (Sandbox Code Playgroud)
请记住,这是一个极其简化的例子.
我想创建不同的表示形式MyDynamicComponent
,将它们附加到[data-dynamic-content]
元素树中,并使它们具有全部功能.
到目前为止唯一有效的方法是在追加到DOM时引导新创建的组件:
import {bootstrap} from '@angular/platform-browser-dynamic';
import {createComponent} from './my-dynamic.component';
export function addComponentDynamically(selector, value) …
Run Code Online (Sandbox Code Playgroud) 我一直在网上和 StackOverflow 上搜索这个,但没有成功。
我正在尝试让 ESLint 将以下内容标记为错误:
export default ...;
Run Code Online (Sandbox Code Playgroud)
同default
是这里的关键。到目前为止,我得到的最好的是对eslint-plugin-import
插件及其一些规则的引用,这些规则可以让我更接近目标,即无匿名默认导出规则。但即使使用此规则,以下默认导出也是有效的:
const foo = 123
export default foo
export default class MyClass() {}
export default function foo() {}
Run Code Online (Sandbox Code Playgroud)
如何配置 ESLint 使这四个也被视为错误?
在我的项目中,我有一个构造函数可以抛出的对象.所以我正在使用的代码如下:
MyObject obj = null;
try
{
obj = new MyObject();
obj.DoSomething();
}
finally
{
if (obj != null)
obj.Free();
}
Run Code Online (Sandbox Code Playgroud)
using (MyObject obj = new MyObject())
{
obj.DoSomething();
}
Run Code Online (Sandbox Code Playgroud)
由.NET CLR转换为
{
MyObject obj = new MyObject();
try
{
obj.DoSomething();
}
finally
{
if (obj != null)
((IDisposable)obj).Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是:我可以以某种方式使CLR将对象的构造函数放入try块中吗?
angular ×3
typescript ×3
c# ×2
javascript ×2
clr ×1
eslint ×1
exception ×1
git ×1
recaptcha ×1
try-finally ×1
using ×1