但是如果是用例如JQuery等方式新增了新的DOM元素後,因為沒有用AngularJS編譯的關係,所以就算裡面有AngularJS的語法也不會呈現預期的結果。
例如像以下的例子:
HTML:
<div ng-app="myApp">
<div id='DOMWrapper' ng-controller="myCtrl">
<button ng-click='addDOM()'>Add DOM</button>
</div>
</div>
Javascript:
var app = angular.module('myApp', []);
app.controller('myCtrl', ['$scope', '$compile', function($scope, $compile) {
$scope.textOfDOM = 'Text show successfully';
$scope.addDOM = function() {
var DOMToAdd = $('<p>{{textOfDOM}}</p>');
//Wrong code -- start
$('#DOMWrapper').append(DOMToAdd);
//Wrong code -- end
//Right code -- start
//var linkOfDOMToAdd = $compile(DOMToAdd);
//var nodeOfCompiledDOM = linkOfDOMToAdd($scope);
//$('#DOMWrapper').append(nodeOfCompiledDOM);
//Right code -- end
};
}]);
從結果中可以看到當按下"Add DOM"按鈕時,出現的字是 "{{textOfDOM}}",而不是我們預期的 "Text show successfully"。
這是因為要新增的DOM沒有被AngularJS編譯的關係,以下才是正確的程式碼:
這是因為要新增的DOM沒有被AngularJS編譯的關係,以下才是正確的程式碼:
HTML:
<div ng-app="myApp">
<div id='DOMWrapper' ng-controller="myCtrl">
<button ng-click='addDOM()'>Add DOM</button>
</div>
</div>
Javascript:
var app = angular.module('myApp', []);
app.controller('myCtrl', ['$scope', '$compile', function($scope, $compile) {
$scope.textOfDOM = 'Text show successfully';
$scope.addDOM = function() {
var DOMToAdd = $('<p>{{textOfDOM}}</p>');
//Wrong code -- start
//$('#DOMWrapper').append(DOMToAdd);
//Wrong code -- end
//Right code -- start
var linkOfDOMToAdd = $compile(DOMToAdd);
var nodeOfCompiledDOM = linkOfDOMToAdd($scope);
$('#DOMWrapper').append(nodeOfCompiledDOM);
//Right code -- end
};
}]);
我們可以呼叫$compile()並把要編譯的DOM送進去當參數,它會返回一個 link 函式,呼叫 link 函式並把scope當作輸入參數,就可以將scope與被編譯的DOM產生連結,所以DOM就可以得到textOfDOM的值,link 函式會返回已經跟資料連結好的新的DOM物件,接著我們再把新的DOM物件用JQuery的語法放到 #DOMWrapper裡面,就可以正確的得到我們要的 "Text show successfully"了。
參考資料:
參考資料:
沒有留言 :
張貼留言