1. 程式人生 > >angularjs在js程式碼中改變了model的值,但是頁面上沒有變化

angularjs在js程式碼中改變了model的值,但是頁面上沒有變化

1.場景重現

在controller中我們先預設給定model的值,然後呼叫了一個外部函式改變這個model的值,頁面上沒有變化,還是顯示預設值。

2.原因分析

AngularJS只會關心在AngularJS的執行上下文中的發生的資料模型(model)的變化(比如,改變資料的程式碼在$apply()裡面)。AngularJS內建的指令也會自動觸發$digest迴圈所以任何資料模型(model)的改變都會反映到檢視中。但是,如果我們更改一個不在AngularJS執行上下文中的資料模型(model),就需要人為的呼叫$apply()來提醒AngularJS資料發生變化了。就像是要告訴AngularJS,我們改變了一些資料,他應該啟用監聽器以便於讓我們所做的改變能夠反映出來。例如,當使用Javascript的set

Timeout()函式來更新一個數據模型的時候,AngularJS就沒辦法知道你改變了資料模型。這種情況下,呼叫$apply()來觸發$digest迴圈就是你的責任了。類似的,如果你寫了一個指令,這個指令是設定了一個DOM事件監聽器,更改資料模型的程式碼在事件處理函式裡,那麼,也需要呼叫$apply()來保證更改能夠反映出來。

3.案例重現

<body ng-app="myApp">
    <div ng-controller="MessageController">
        Delayed Message: {{message}}
    </div>  
</body>
/* 沒有$apply()會發生什麼 */
angular.module('myApp', []).controller('MessageController', function ( $scope ) {

    $scope.getMessage = function () {
        setTimeout(function () {
            $scope.message = 'Fetched after 3 seconds';
            console.log('message:'+$scope.message);
        }, 2000);
    };

    $scope.getMessage();
});
通過執行這個例子,我們會發現,在兩秒之後,函式開始執行,並且更新資料模型。但是,檢視卻沒有更新。原因我們也應該猜到了,我們忘了呼叫$apply()。

因此,我們需要像下面這樣來寫我們的getMessage()函式。

angular.module('myApp', []).controller('MessageController', function ( $scope ) {
    $scope.getMessage = function () {
        setTimeout(function () {
            $scope.$apply(function () {
                //wrapped this within $apply
                $scope.message = 'Fetched after 3 seconds';
                console.log('message:' + $scope.message);
            });
        }, 2000);
    };

    $scope.getMessage();
});
執行更新後的例子,兩秒之後,我們就能夠看到檢視更新了。我們所做的唯一的改變就是將程式碼放進了$scope.$apply()中。這樣,就能自動的去呼叫$rootScope.$digest(),然後,監聽器就會啟動,檢視就會更新了。

相關推薦

angularjs在js程式碼改變model但是頁面沒有變化

1.場景重現 在controller中我們先預設給定model的值,然後呼叫了一個外部函式改變這個model的值,頁面上沒有變化,還是顯示預設值。 2.原因分析 AngularJS只會關心在Angul

angularjs在程式碼改變 modelview 卻沒有更新

今天在完成專案任務時,遇到一個問題資料初始繫結時沒有問題,然後通過在百度地圖 API提供的函式中修改了 model(ng-model 繫結在輸入框上),在頁面中不能實時更新,但是點選其他的輸入框或者按鈕時,就可以更新,查看了很多資料後,發現了上面的那篇文章,

兩篇文件解釋這段程式碼的兩個疑問order_by('-pub_date')[:5]和[q.question_text for q in latest_question_list]

我們還可以指定逆向排序,在前面加一個減號 - 字首: ? 1 2 >>> Publisher.objects.order_by("-name") [<Publisher: O'Reilly>, <Publisher:

IOS XIB設定約束後無法在程式碼改變檢視的frame

今天在修改程式碼的時候發現了一些問題,便做了一下優化 先上圖說事: 在這裡的播放列表cell中是兩個UILabel分別顯示的是作品名和作者名。沒修改之前,兩個lab實在XIB中初始化和設定約束的,出來的效果就是無法動態的根據字串長度來增加lab的寬度,或

model取到的兩個進行加減乘除運算

直接看例子,shopCartInfoList為一個集合 我們看乘積之間的計算 。。。如下紅色字型 計算價格 *    和 購買數量的  乘積  <c:forEach items="${shopCartInfoList }" var="var"> <td

tryreturn某而finally修改這個

try中return某值,而finally中修改了這個值 首先上結論: 1、try{…} finally{…} return  順序執行 2、try{ return } finally{…} return  finally修改基本型別,則不影響返回值 finally修改非基本

王堅:「資料」改變商業模式運算能力決定企業的競爭力

最大 最重要的 www 自然 但是 alpha 支付 想法 好的 阿裏巴巴集團技術委員會主席、阿裏巴巴的雲端建立者,王堅博士於上週來到臺灣,出席了阿裏巴巴針對臺灣創業者舉辦的一場大會時,發表了他對於雲端運算、大數據以及人工智慧的一些看法以及建議。 由於是針對創業者的場

從一組集合獲取分多次取集合的每段數據的最大重組成一個新的集合。

clas pub 處理 oat private color andro sublist roi 一個項目中偶遇的簡單算法,個人覺得還不錯,雖不常用,也記錄在此吧。 1 package huolongluo.qihuo.util; 2 3 import androi

最近項目遇到一個場景其實很常見就是定時獲取接口刷新數據。那麽問題來假設我設置的定時時間為1s而數據接口返回大於1s應該用同步阻塞還是異步?

set timeout pre git plain 異步執行 項目 strip nod 初識setTimeout 與 setInterval 先來簡單認識,後面我們試試用setTimeout 實現 setInterval 的功能 setTimeout 延遲一段時間執行一

棧表獲取最小時間複雜度為O(1)

       近期複習資料結構,看到網上有一道演算法題,該題目曾經是google的一道面試題,國內的網際網路公司也紛紛效仿。我也順便複習之。        題目內容為:對現在的stack(棧)資料結構進行改進,加一個

leetcode671+二叉樹第二小的先搜尋然後儲存到set

https://leetcode.com/problems/second-minimum-node-in-a-binary-tree/description/ /** * Definition for a binary tree node. * struct TreeNode { *

求任意一個區間的最大最小 - 單調棧

連結:https://ac.nowcoder.com/acm/contest/223/C來源:牛客網 題目描述 給出長度為n的序列a,其中第i個元素為 ,定義區間(l,r)的價值為 請你計算出

(vue.js)vue引用別的元件 如何使this指向Vue物件

Vue中引用了別的元件 ,如何使this指向Vue物件   今天學習Vue元件傳值, 通過建立Vue例項, 廣播和監聽實現傳值, 但是傳值之後無法直接將得到的值應用到Vue物件, 因為這相當於引用改了別的元件, this指向發生改變,所以通過以下辦法解決。 var _this

angularjs ng-if 的ng-model 作用域問題

現象:最近做了一個需求,頁面上使用了ng-if 條件做判斷,導致通過使用 $scope 獲取不到 ng-model 的值。 問題原因: ng-if這個指令單獨開了一個作用域,它只可以繼承,不可以進行往外傳值。   解決辦法: 這個問題就是一個作用域的問題。使用 ng-if ,需要在傳值的地

定義一個數組陣列初始長度由控制檯獲取 。隨後手動給陣列每個元素賦值,陣列滿後將陣列長度擴充二倍並輸出清空陣列所有元素且繼承陣列長度並重新進行手動新增元素無限死迴圈直至輸出-0後結束程式。

package com.tedu; import java.util.Arrays; import java.util.Scanner; /** * 需求: * 定義一個初始陣列,陣列初始長度由控制檯獲取 * 隨後手動給陣列中每個元素賦值,陣列滿後將陣列長度擴充二倍輸

spring 在Java定義變數ischeck訪問時jsp報錯

可能是衝突了,把ischeck改成其他名稱就好了,我這裡把它改為了check package springForm.test; public class TestUser { private String name; private String password;

ExtJs Grid根據列表某列的修改整行資料的背景色 ExtJS版本為2.3

這段時間又開始做ExtJS了,需求是要根據列表中某列資料的值,將整行資料的背景色修改掉: 只需要在grid初始化的時候給grid加上一個配置項即可; var gridCfg = { region : 'center', store : store, anchor

xcode 編譯器是如何發現程式碼出現”迴圈引用”的

場景 有時候寫程式碼會出現這樣的警告 Capturing ‘self’ strongly in this block is likely to lead to a retain cycle。意思是說在 block 裡面寫了強引用的 self 可能會導致”迴圈引用”。 什麼

VS Code編寫C語言程式碼除錯之後能輸入按回車之後閃退

在使用VS Code編寫一段C程式程式碼時,程式碼沒有任何問題,按F5進行除錯可以啟動執行,當輸入值後,按下enter鍵就出現閃退的情況,下面就來帶您一起解決這一問題,希望對您有所幫助: 如下小栗子~ 更改前的程式碼: //列印金字塔 #include<stdio.h&

js篇-判斷陣列物件是否含有某個並返回該條資料

專案背景需求是: 已知: var a=[{name:'jenny',age:18},{name:'john',age:19},{name:'jack',age:20}] var b ='jenny' 返回: {name:'jenny',age:18} 解題思路:現將陣列轉成字串,判斷改陣列中是否存