2014-01-31 31 views
0

我知道$apply用於連接Javascript上下文和AngularJS上下文。

一個簡單的例子如下:

模板:

<div>{{someVal}}</div> 

的JavaScript控制器:

setTimeout(function() { 
    scope.$apply(function(){scope.someVal = 123}); 
}, 1000); 

我們需要在上述情況下使用$apply

首先Qustion:

如果我修改上面的javascript來:

setTimeout(function() { 
    scope.someVal = 123; 
}, 1000); 

scope.$watch('someVal', function(val) { 
    console.info(someVal); 
}); 

修改爲123約someVal沒有控制檯...爲什麼?我們不能看超時回調中修改的表達式嗎?

第二個問題:

如果我們使用ngSwitch指令象下面這樣:

<div ng-switch on="sub"> 
    <div ng-switch-when="a"> 
//state a 
    </div> 
    <div ng-switch-when="b"> 
//state b 
    </div> 
</div> 

當我修改sub在控制器:

scope.sub = 'a'; 
setTimeout(function() { 
    scope.sub = 'b'; 
}, 1000); 

無需使用$apply !!!!爲什麼?

我發現ngSwitch指令使用$watch來監視on屬性值。爲什麼ngSwitch可以監視超時回調中修改的範圍屬性?????

請告訴我關於上述2個問題的原因。

+0

第二個問題解決了!其他$申請觸發$申請someVal,如http://jsfiddle.net/stefanqi/Jvak8/。 – Stefan

回答

1

AngularJs文檔

$申請()是用來從角框架的外側角來執行的表達式。 (例如,來自瀏覽器DOM事件,setTimeout,XHR或第三方庫)。因爲我們正在調用角度框架,所以我們需要執行適當的異常處理範圍生命週期,執行手錶。

window.setTimeout是一個JavaScript函數,所以無論你使用setTimeout您必須使用$適用()更新模型。

你的第二個例子不會沒有$apply()工作,我做了一個demo澄清$watch$apply問題。請檢查一下。

+0

對不起,我無法訪問您的演示。 – Stefan

+0

你是對的!我發現申請someVal的$是在其他$ apply中觸發的......我對我遇到的問題做了一個小提琴:http://jsfiddle.net/stefanqi/Jvak8/。無論如何,謝謝! – Stefan

0

使用Angularjs $timeout service代替setTimeout,你不需要$ apply。同樣的事情是,如果您使用的是jQuery http調用,請使用角度http服務來避免使用$ apply。

1

您可以使用$timeout這是window.setTimeout的包裝,並通過這種方式,你不會需要使用$應用在回調:

$超時(函數(){ scope.someVal = 123 ;},1000);

當您運行Angular之外的代碼時,您需要一種讓Angular和該值的觀察者知道它已經改變的方法。那是什麼$apply是,它將使手錶聽衆火

關於你的第二個問題,中爲什麼範圍沒有$更新應用,你應該間接射擊總得$應用/ $消化。爲了給你一個更具體的答案,一個Plunker將有必要檢查你的代碼還有哪些內容。

相關問題