模型:在同一個頁面,用ng-include的方式做A、B兩個視圖切換。在A頁面有一個tms-data的指令,通過$sce處理並綁定後臺傳遞過來的數據。
爲什麼使用$sce?
因爲angularJS裏好些地方,比如路徑默認是個字符串,不會認爲是路徑,從而訪問不到我們需要的東西,那麼我們就可以通過$sce告訴angualrJS這個路徑,這樣是很安全滴。
比如,當處理文件地址時,代碼是這樣寫的:
case 'file':
case 'voice':
repos.forEach(function(oFile) {
if (oFile.url) {
oFile.oUrl = oFile.url;
oFile.url = $sce.trustAsResourceUrl(oFile.url);
}
});
break;
頁面的嵌套關係是這樣的:
父容器
<body ng-controller="ctrlFather">
<div ng-include="selectedTab"></div>
</body>
A視圖
<div class="A"><tms-data repos="repos"></tms-data></div>
B視圖
<div class="B" ng-controller="ctrlB">我是B視圖</div>
js:
var app = angular.module('demo', []);
app.controller('ctrlFather', ['$scope', '$sce', function($scope, $sce) {
$scope.repos = [{
url: 'http://fanyi.youdao.com/'
}]
}]);
app.controller('ctrlB',['$scope', function($scope){}]);
問題:當首頁加載頁面完畢後,數據都正常顯示;當切換B視圖又切回A視圖之後,這個鏈接只是顯示了一個‘{}’
分析:當切換視圖之後,controller都會重新加載一遍,那麼數據就會被watch更新一遍,爲什麼沒有更新?
原因:
1、經歷這些邏輯,處理的是外部傳遞進來的repos;
2、因爲A頁面的數據就在父Controller中,所以此時的repos就是被處理完成後的repos;
3、被$sce處理過的數據已經變成了一個安全的對象,而不再是原數據的字符串,所以再經歷那麼處理邏輯,最後還是一個{};
解決:在需要處理的地方,加flag判斷邏輯。就是當處理過後,就不再去處理了。