【问题标题】:Angular update formcontrol with javascript使用 javascript 更新表单控件
【发布时间】:2019-09-25 18:07:22
【问题描述】:

我们有一个带有视图的 Angular 应用程序

<input [formControl]="fc" (keyup)="change($event)" id="test">
check if it worked: {{ fc.value }}

和组件

public fc = new FormControl('nothing here');
public change(event): void {
    console.log('changed', event);
}

如何使用 javascript 更改输入以模拟真实用户输入?

该解决方案必须适用于 IE11。

我们可以用js改变值:

const el = document.getElementById('test');
el.value = 'success';

值发生了变化,但change-方法没有被调用并且formControl.value没有被更新。

我怎样才能做到这一点?

我不能在组件代码内部做任何事情,因为它是一个执行此代码的单独环境。值更改后,我已经尝试使用el.dispatchEvent(someEvent)。其中 someEvent 是带有keyupkeydownchange 的新事件/新键盘事件,并且还给了它像{key: 's'} 这样的对象......到目前为止没有任何效果。还尝试了el.focus()el.blur() 以及其他一些东西。

假设这与changeDetection 有关,并且自从setValuepatchValue 被调用后,fc 就没有得到更新。

一定有这样的:

el.value = 'success';
angular.pleaseDoCorrespondingStuff();

有什么想法吗?

请注意,为了简化示例,(keyup) 在这里只是一个示例,可以是任何东西。实际上,我们将 Angular 材质的日期选择器包装在模板中,并在此处有一个 (dateChange) 事件。

【问题讨论】:

    标签: javascript angular internet-explorer-11 angular-reactive-forms


    【解决方案1】:

    请检查您的代码,在更改事件中,您没有更改值。我使用以下代码在我这边创建了一个示例,似乎一切正常,我可以获取日志和数据更新

    component.ts 中的代码:

      onSearchChange(searchValue : string ) {  
        console.log(searchValue);
        this.name = searchValue;
      }
    

    component.html 中的代码:

    <input type="text" id="txtinput" class="form-control" (input)="onSearchChange($event.target.value)"><br/>
    <span>{{ name}}</span>
    

    我使用您的代码创建了一个示例,当我使用以下代码发送密钥时,它将触发输入事件并获取日志:

                var options = new InternetExplorerOptions()
                {
                    InitialBrowserUrl = URL,
                    IntroduceInstabilityByIgnoringProtectedModeSettings = true,                   
                };
    
    
                var driver = new InternetExplorerDriver(IE_DRIVER_PATH, options);
                driver.Navigate();
                var text = driver.FindElementById("test");
                text.SendKeys("aa");
    
                text.SendKeys("bb");
    

    【讨论】:

    • 你好吕,谢谢你的回答。然而, onSearchChange 不应该设置一个值,而是以不同的方式使用来发出和事件,我们对它做出反应并做其他事情。我没有写任何东西,只写了一个 console.log 来表明我想看到这个方法被调用了。无论我们尝试什么,SendKeys 都会输入一些内容,就像 el.value = xyz 所做的那样。但是,Angular FormControl 不会更改值,也不会使用此解决方案调用该方法。我不能使用(输入),因为我们不控制 Angular Material 命名。
    • 我注意到你的问题被修改了,你是否还在使用IE selenium webdriver?如果仍然使用此方法,我还创建了一个示例来测试您的代码并使用 sendkeys 方法模拟真实的用户输入,该代码在我这边运行良好。截图as below.
    • 谢谢@zhi-lv 这在IE11中有效吗?我改变了答案,因为我想知道如何在一般的 Angular 中触发它——不一定是硒。 Selenium 只是这里的情况,是的,这会让事情变得更好,但是我更喜欢一个简单的 JS 解决方案,以便能够理解发生了什么。
    • 是的,它在IE 11下工作,你可以查看之前评论中的截图,它使用的是IE浏览器。
    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多