2013-10-14 23 views
6

如果我用常規的ng-bind函數,一切似乎都沒有問題。但如果我使用ng-bind-html,我收到無限摘要錯誤。

=== View === 
1. <span ng-bind="test()"> 
2. <span ng-bind-html="test()"> 

=== Controller === 
1. $scope.test = function() { 
     return 1; 
    } 

2. myapp.controller('myapp', function($scope, $sce) { 
    $scope.test = function() { 
     return $sce.trustAsHtml('<input></input>'); 
    } 
}); 

任何想法這裏發生了什麼?視圖確實呈現輸入,但會引發無限錯誤digest error。文檔也不是很有幫助。

+0

你似乎已經命名自己的控制器同樣的事情,你的主模塊。這可能不是一個好主意。 – ksimons

+0

好吧,這只是一個例子。忽略名稱是相同的。 –

+0

你有一個你可能想修復的錯字 -而不是 KayakDave

回答

15

問題是,當你的ng-bind-html被評估時,Angular會調用你的測試函數並得到$sce.trustAsHtml('<input></input>')的結果。然後Angular再次評估所有綁定,看看是否一切已經解決。這意味着它再次調用您的測試函數,並查看返回值是否與舊值匹配。不幸的是,事實並非如此。這是因爲從$ sce.trustAsHtml返回的值不能通過===進行比較。

試試這個作爲證明:

console.log($sce.trustAsHtml('<input></input>') === $sce.trustAsHtml('<input></input>')); 

,將打印錯誤。這意味着每次Angular都會調用您的測試函數,就其而言,它會返回不同的值。它嘗試了很多次,然後放棄。

如果改爲$ sce.trustAsHtml的結果綁定到一個範圍變量,而不是一個函數調用,問題消失:

$scope.input = $sce.trustAsHtml('<input></input>'); 

<span ng-bind-html="input"></span>