2014-01-15 116 views
12

我有這樣的代碼,我看不出哪裏是問題的根源,我沒有得到任何錯誤的鉻控制檯 我的控制器:角控制範圍沒有更新

function notifController($scope) { 
    $scope.refreshMsgs = function() { 
    $.post("notification-center-trait.aspx") 
     .success(function (data) { 
     $("#loadedthings").html(data); 
     newMsgs = JSON.parse($("#label1").html()); 
     $scope.msgs = newMsgs; 
     }); 
    } 
    $scope.refreshMsgs(); 
} 

label1label2被正確加載到div中加載;

控制檯中的newMsgs被解析爲它應該的方式;

我曾經有過爲其他頁面的工作,但似乎我錯過了這個one.i東西有<html ng-app>標籤:

<div ng-controller="notifController"> 
    <div class="row"> 
    {{msgs.length}} new msgs : 
       <table class="table"> 
        <tbody > 
         <tr ng-repeat="msg in msgs"> 
         <td> 
          {{msg.sender}} 
         </td> 
         <td> 
          {{msg.message}} 
         </td> 
         <td> 
          {{msg.date}} 
         </td> 
         </tr> 
        </tbody> 
       </table> 
</div> 
</div> 

我在控制檯中「未定義」當我執行此:angular.element($0).scope()

+0

你確定'$ 0'正在工作嗎?我不知道你在做什麼... – m59

+0

我測試了你的代碼,這裏的一切工作正常。我懷疑你搞錯了DOM,並犯了一個錯誤。像angular.element一樣屬於指令。 Angular使scope屬性在需要的地方可用,除了* maybe *罕見的異常外,所以你不需要以這種方式訪問​​元素或範圍。 – m59

+0

@ m59我剛剛在chrome控制檯中執行'angular.element($ 0).scope()'來查看我的作用域中發生了什麼[link](http://stackoverflow.com/questions/13743058/how-to -access-the-angle-scope-variable-in-browsers-console)但是我得到'undefined' – zerzer

回答

25

無視我在評論中指出的其他架構問題,真正的問題是您正在使用jQueryajax而不是Angular的$http。當你不通過Angular做類似的事情時,你在Angular的範圍之外工作,並且它不知道變化。雖然不理想,但您可以使用$scope.$apply讓角度知道某些事情是在其知識之外更新的。這將是這樣的:

$scope.$apply(function() { 
    $scope.msgs = newMsgs; 
}); 

即告訴角度,你已經修改它的東西需要了解從上下文,它不知道(在這種情況下,jQuery的AJAX調用)。

$scope.$apply()有一些有效的用途,例如在事件處理程序中,但在大多數情況下,它是壞習慣的標誌。你肯定應該使用Angular的$http進行ajax調用。

+1

作爲一個附錄,如果你在錯誤的時間使用$ scope。$ apply,可能會拋出錯誤(你不能把它放在任何你行爲不當的地方,作爲他們所有的解決方案),然而,$ timeout(一個Angular wrapTime for setTimeout)將始終表現出來,並確保您的更改以* next * $ apply通行證結束(無論如何,這都是他們將要登陸的地方)。它不應該被濫用,但它比$ apply更安全,不會在指令中被骯髒的黑客攻擊,以檢查它是否安全/需要。 – Norguard

+0

@Norguard True ...但是如果你曾經在一個拋出錯誤的地方使用'$ apply',那麼根本不應該使用它。這是一個巨大的代碼味道。就像我說的,除非你使用事件或第三方庫,否則通常不需要「$ apply」。 – m59

+1

絕對。但是其中的一些第三方庫是半同步的,半異步的,而其他的則是自己的pub/sub或setTimeout的兔子洞,或者只是要求你自己在這些圈子中圍繞它們跳舞。我直接知道,如果你不小心,MasonryJS(用於pinterest /無限滾動佈局)和D3JS(用於製作可補間的SVG圖)都可以提供他們與'if(!$ scope。$ rootScope 。$$階段)'廢話,如果Angular只是部分綁定到進程中(如在ng-repeat中調用Msnry.stamp + Msnry.layout ...)。 '$ timeout'非常優雅。 – Norguard