为啥 $scope.value 仅在我们单击文本框和屏幕后才显示为预填充文本框,即使使用 Angular 的就绪功能

Posted

技术标签:

【中文标题】为啥 $scope.value 仅在我们单击文本框和屏幕后才显示为预填充文本框,即使使用 Angular 的就绪功能【英文标题】:Why $scope.value is only showing as prefilled textbox after we click on Text box and screen even using angular's ready function为什么 $scope.value 仅在我们单击文本框和屏幕后才显示为预填充文本框,即使使用 Angular 的就绪功能 【发布时间】:2020-09-14 20:44:57 【问题描述】:

我正在尝试在准备好的函数中使用 $scope.lastName="ThisIsLastname" 设置名为 lastName 的 ng-model 的值。我可以设置值,也可以设置它,因为我可以在控制台中看到,但问题是文本框本身没有出现值(文本框没有预填充)。仅当我单击文本框然后单击屏幕中的任意位置时,才会预填充文本框。

<input type="text" ng-model="lastName" /> <!-- this textbox should be prefilled when screen load using ng-model only -->


angular.element(document).ready(function () 
    console.log("is ready now");
    $scope.lastName="ThisIsLastname"; //set value
    console.log($scope.lastName); // I can see that value has been set successfully.
);

所以当我重新加载页面时,我可以看到一旦调用了准备好的函数,该值就会打印在控制台上,但是我可以看到空文本框(姓氏的值未显示在文本框上)。

但是当我第一次单击那个空文本框,然后单击屏幕上的任意位置时,会出现文本框的值。我不明白是什么让它现在出现但在调用 ready 函数时没有出现。

我不需要替代解决方案,我想了解为什么会发生这种情况!

【问题讨论】:

【参考方案1】:

在 angularjs 中,angular.element 是一个 jqLite 对象


用归零的$timeout 包装代码以触发摘要循环:

console.log("is ready now");

$timeout(function()      
  $scope.lastName="ThisIsLastname";    
); 

console.log($scope.lastName); 

【讨论】:

【参考方案2】:

.ready() 不是 angularjs 的一部分,而是 jqlite (jquery)。因此,即使您正在分配 $scope.value,您也已经开始了一个摘要循环来更新 dom。

您可以在分配 $scope.value 后添加 $scope.$apply() 以运行摘要循环。

【讨论】:

以上是关于为啥 $scope.value 仅在我们单击文本框和屏幕后才显示为预填充文本框,即使使用 Angular 的就绪功能的主要内容,如果未能解决你的问题,请参考以下文章

为啥单击文本框垃圾结果的报告?

VueJs:按钮单击仅在单击两次时有效

为啥我收到错误“Microsoft Visual Studio 2012 已停止工作”(当我单击文本框时)[关闭]

仅验证指定的文本框

在 extjs 网格视图中显示文本框

为啥我不能在我的 pygame 文本框中输入超过 1 个字母? [复制]