W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
這個(gè)示例嘗試實(shí)現(xiàn)一個(gè)重復(fù)語句,功能同官方的 ngRepeat
,但是使用方式類似于我們通常編程語言中的 for 語句:
<div ng-controller="TestCtrl" ng-init="obj_list=[1,2,3,4]; name='name'"> <ul> <for o in obj_list> <li>{{ o }}, {{ name }}</li> </for> </ul> <button ng-click="obj_list=[1,2]; name='o?'">修改</button> </div>
同樣,我們從上面的使用方式去考慮這個(gè)指令的實(shí)現(xiàn):
1000
, terminal 設(shè)置為 true
。for
節(jié)點(diǎn)補(bǔ)充成一個(gè)正確的 HTML 結(jié)構(gòu),即里面的屬性都會(huì)變成類似 o=""
這樣。我們通過節(jié)點(diǎn)的 outerHTML
屬性取到字符串并解析取得需要的信息。for
節(jié)點(diǎn)之間的內(nèi)容作為一個(gè)模板,并且通過循環(huán)多次渲染該模板之后把結(jié)果填充到合適的位置。scope
的,并且 o
這個(gè)成員需要單獨(dú)賦值。注意:這里只是簡單實(shí)現(xiàn)功能。官方的那個(gè) ngRepeat 比較復(fù)雜,是做了專門的算法優(yōu)化的。當(dāng)然,這里的實(shí)現(xiàn)也可以是簡單把 DOM 結(jié)構(gòu)變成使用 ngRepeat 的形式 :)
JS 部分代碼:
var app = angular.module('Demo', [], angular.noop); app.directive('for', function($compile){ var compile = function($element, $attrs, $link){ var match = $element[0].outerHTML.match('<for (.*?)=.*? in=.*? (.*?)=.*?>'); if(!match || match.length != 3){throw Error('syntax: <for o in obj_list>')} var iter = match[1]; var list = match[2]; var tpl = $compile($.trim($element.html())); $element.empty(); var link = function($scope, $ielement, $iattrs, $controller){ var new_node = []; $scope.$watch(list, function(list){ angular.forEach(new_node, function(n){n.remove()}); var scp, inode; for(var i = 0, ii = list.length; i < ii; i++){ scp = $scope.$new(); scp[iter] = list[i]; inode = tpl(scp, angular.noop); $ielement.before(inode); new_node.push(inode); } }); } return link; } return {compile: compile, priority: 1000, terminal: true, restrict: 'E'}; }); app.controller('TestCtrl', angular.noop); angular.bootstrap(document, ['Demo']);
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: