angularjs指令,經過$sce.trustAsResourceUrl處理初次綁定後又跳回該視圖(不做刷新),該如何渲染?

模型:在同一個頁面,用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判斷邏輯。就是當處理過後,就不再去處理了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章