angularJS——数据更新了但是view层却未更新问题及解决方法

搬运自:https://www.cnblogs.com/yky-iris/p/9251230.html?utm_source=debugrun&utm_medium=referral

视图不更新问题及原因: 在原生js或者第三方框架下,修改model,是有可能不会触发视图更新的,比如setTimeout、jquery插件。因为他们脱离了Angularjs的上下文,Angularjs并不能监听到数据的改变。

解决方法:利用$apply()手动更新视图,如下。

html:

<p>{{name}}</p>

js:

$scope.name="张三";
setTimeout(function(){
    $scope.name = ‘李四‘;
    //$scope.$apply()
},500)

  一. $apply(),digest概念  

  $apply()函数的作用: 可以从Angular框架的外部让表达式在Angular上下文内部执行。

  $apply()函数工作原理:相当于一个触发器,它的作用就是触发digest循环,从而更新视图。

  digest是什么?:digest是Angularjs的核心,是它实现了神奇的数据绑定。凡是触发事件,必会触发digest循环,比如ng事件,click,change,实际上都是触发了digest循环。

  二. 更好的运用digest   

  在Angularjs中,除了$apply可以触发digest循环外,还有其他的方法,也可以触发此循环。而且$apply往往是最坏的选择。下面推荐一些更好的选择。

(1). $digest

$scope.$digest()的速度要比$apply要快,因为它只更新当前作用域和子作用域的值,对于父作用域时不管的。而$apply还要评估父作用域,这就大大消耗了性能。

(2). $timeout

用$timeout去代替你的setTimeout,$timeout作为Angularjs的自带服务,当然时更契合Angularjs环境啦。它会隐性触发digest循环,而且它会延迟执行,会在上一个digest循环完成后的下一刻,触发digest循环,这样就不会出现上文所说的   

$digest already in progress

我们把setTime的代码放到$timeout中

$timeout(function(){
  $scope.name = ‘李四‘;
},500)

这就能正常工作了,看,没有讨厌的apply了!

(3). $evalAsync

最推荐的应该时这个方法了。如果当前正好有一个digest循环在执行,那么它就会把导致digest循环的操作,放到当前digest循环中去执行。而$timeout是要等到当前digest循环执行完,再执行一次digest循环才可以。所以evalAsync执行更快,性能更好。我们可以像$timeout那样去调用它,即

$scope.$evalAsync(
    function( $scope ) {
        console.log( "$evalAsync" );
    }
);

原文地址:https://www.cnblogs.com/linjiangxian/p/12221296.html

时间: 2024-07-29 08:48:14

angularJS——数据更新了但是view层却未更新问题及解决方法的相关文章

ADODB.Connection 错误 &#39;800a0e7a&#39; 未找到提供程序。该程序可能未正确安装。解决方法!

[问题描述]调试基于ACCESS+ASP的网站程序的时候,遇到如下错误: ADODB.Connection 错误 '800a0e7a' 未找到提供程序.该程序可能未正确安装. /Inc/Function.asp,行 9 [原因分析]因为系统是64位的win7或win8.1所以会出现这个问题,解决方法如下: [解决方法]找到IIS应用程序池,“设置应用程序池默认属性”-->“常规”-->”启用 32 位应用程序”,设置为 True即可解决. ADODB.Connection 错误 '800a0e

Silverlight运行时提示未安装silverlight runtime 解决方法

出现该问题是由于电脑上安装的silverlight不是silverlight developer. 一般来说安装完VS之后是不会出现该问题. 但是一旦更改了silverlight中web service中TestPage的minRuntimeVersion版本,因为默认生成的版本号是silverlight sdk(根据创建项目时选择的是silverlight 4还是5来判断是哪个版本的SDK)的版本号.一旦修改的版本号比电脑安装的sdk版本高,则会在第一次运行时提示需要安装更新版本的silver

新增硬盘后,其他盘变成未分区空间的解决方法

许多人为了加速开机速度,提升电脑运行能力,于是买了新的固态硬盘来做主硬盘,原来的硬盘用光驱硬盘托架扩展. 在其过程中,会暴露许多问题,下面我来帮助大家解决一个最常见的问题:新增硬盘后,原来的已有盘变成了为分区空间. 现象:新增硬盘后,原来的已有盘变成了为分区空间. 解决方法: 1.下载分区助手或者是DiskGenius 下载地址: 分区助手:http://www.onlinedown.net/soft/250766.htm DiskGenius:http://rj.baidu.com/soft/

java 小程序查看器 启动:未初始化小程序 解决方法

欢迎大家转载.为保留作者成果,转载请注明出处,http://blog.csdn.net/netluoriver,有些文件在资源中也能够下载.假设你没有积分.能够联系我索要! 在执行java程序的时候突然出现启动:未初始化小程序,  百度了一大堆资料都没有解决方式.但程序还是要用啊.依照又一次建立project的步骤又一次来吧.总之肯定是某个地方出现了错误! 依据多次尝试最终找到了解决方法.不知道你们的和我的是不是相同的原因引起的.方法例如以下: 1.右击project----属性,如图: 2.依

xmapp启动Tomcat时报JDK、JRE未安装错误的解决方法

我的xmapp是1.8,用的是非安装版的JDK,设置好JAVA_HOME之后,用xmapp控制面板启动Tomcat时报JDK.JRE未安装错误,错误内容如下: 17:07:17 [Tomcat] Attempting to start Tomcat app... 17:07:18 [Tomcat] Tomcat Started/Stopped with errors, return code: 1 17:07:18 [Tomcat] Make sure you have Java JDK or 

关于“horizon view,在配置Composer出错问题”解决方法

关于"horizon view,在配置horizon view 添加服务器时,在view composer域添加时提示"检查管理员出错.请重新检查您的信息."问题解决方法 错误如图: 解决方法:1.先绕过View Composer设置."不使用View Composer",下一步直至完成.会看到已经生成了一条配置.选中这条信息后,点击"编辑"2.View Composer Server 设置点击"编辑"3.最后一直下

日常工作中遇到“-bash: netstat: 未找到命令”的解决方法

1.遇到的问题如下: [[email protected] ~]# netstat -anptu | grep mysql -bash: netstat: 未找到命令 2.解决方法如下: [[email protected] ~]# yum -y install net-tools <!--安装依赖程序--> 已加载插件:fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * e

Android中View转换为Bitmap及getDrawingCache=null的解决方法

1.前言 Android中经常会遇到把View转换为Bitmap的情形,比如,对整个屏幕视图进行截屏并生成图片:Coverflow中需要把一页一页的view转换为Bitmap.以便实现复杂的图形效果(阴影.倒影效果等):再比如一些动态的实时View为便于观察和记录数据.需要临时生成静态的Bitmap. 2.实现方法 1)下面是笔者经常用的一个转换方法 public static Bitmap convertViewToBitmap(View view, int bitmapWidth, int

【软件故障处理】teamviewer提示伙伴未连接到路由器解决方法

在家用电脑A远程公司电脑B,提示"伙伴未连接到路由器", 但是我在家同样是用电脑A连同事的电脑C,可以连上,由此可以排除是电脑A的问题,很可能是电脑B的问题 于是第二天在公司用同事的电脑C连电脑B依然提示"伙伴未连接到路由器",可以断定是电脑B的问题 我重装了电脑B上的teamviewer,再次用同事的电脑C连电脑B,就可以连上了. 虽然我不知道连不上具体是什么原因造成的,但是觉得那句"百分之XXX的问题可以通过重启或重装解决"的确很有道理哈~