請耐心等待,因爲我試圖解釋這一點,因爲它有點複雜,我對JQuery完全陌生,並且試圖讓我的頭腦清楚。爲jquery模板附加包含html的腳本
我和我的團隊正在研究WebParts的SharePoint項目。 WebPart包含一個用戶控件(SearchControl),它有一個鏈接來打開一個包含另一個用戶控件(SelectorControl)的對話框(使用jquery ui)。
SelectorControl包含:
- 被使用JQuery模板填充下拉列表(objTemplates)
- 正在使用另一個JQuery的模板填充的表格;和
- 只讀文本輸入從表格中顯示當前選擇的項目
SelectorControl代碼:
<div class="objSelector">
<script id="objSelectorTemplate" type="text/x-jquery-tmpl">
<div class="table">
<div class="row">
<div class="labelInputGroup">
<label for="objTemplates">Obj Template</label>
<select id="objTemplates">
{{each ObjectTemplates}}
<option value="${ObjectTemplateId}">${Name}</option>
{{/each}}
</select>
</div>
</div>
<div><br></div>
<div class="row">
<div>
<table class="tableGrid">
<thead>
<tr>
<th>Object Name</th>
</tr>
</thead>
<tbody id="listPlaceholder">
</tbody>
</table>
<div id="pagerPlaceholder"></div>
</div>
</div>
<div id="templatePlaceholder">
</div>
<div><br></div>
<div class="row">
<input type="hidden" id="localSelectedObjectId" class="hidden" />
<label for="localSelectedObject">Selected Object</label>
<input type="text" class="dealName" id="localSelectedObject" readonly="readonly" placeholder="No object selected"/>
</div>
</div>
</script>
<script id="listTemplate" type="text/x-jquery-tmpl">
<tr>
<td><a class="objectItem" id="${Id}" href="#">${Name}</a></td>
</tr>
</script>
<div id="pagerControl">
<uc1:PagerControl ID="PagerControl1" runat="server" />
</div>
</div>
的下拉列表只是填充對話之前,使用從檢索到的數據被創建一個WCF服務,然後綁定到第一個模板。
'change'事件綁定到下拉列表,使用live通過調用WCF服務並通過下拉列表中的當前選定項目來填充表(第二個模板)。
當觸發下拉列表中的變化時,裝入對象被稱爲:
function LoadObjects(event) {
var dialogDom = event.data.DialogDom;
var searchObj = GetSearchFilters(); // removed irrelevant code here
var listTemplate = searchDom.find('#listTemplate');
var templatePlaceholder = dialogDom.find('#templatePlaceholder');
templatePlaceholder.empty();
templatePlaceholder.append(listTemplate);
var pagerControl = searchDom.find('#pagerControl');
var pagerPlaceholder = dialogDom.find('#pagerPlaceholder');
pagerPlaceholder.append(pagerControl);
var list = GenerateList(
dialogDom,
$('<div></div>'),
searchObj,
Connection('MyUiService', 'GetObjects'));
}
的GenerateList()方法創建了各種方法,包括那些從WCF獲取的對象數據的jQuery對象服務並將其綁定到模板(listTemplate)
PagerControl代碼還包含一個模板,該模板與listTemplate同時填充。
listTemplate和pager的代碼必須放在objectSelectorTemplate腳本之外,然後在稍後進行復制以防止在解析頁面以填充下拉列表時將其刪除。
所有上述工作在第一次打開對話框並從下拉列表中選擇一個項目時正常。可以毫無問題地更改表格中數據的頁面,但只要下拉列表中選定的項目發生更改,表格數據就不會再加載。如果我遍歷代碼,我可以看到append()(在LoadObjects方法中)在將listTemplate腳本插入到listPlaceholder時刪除它,這意味着當對話框再次加載表數據時,腳本不再那裏。爲了解決這個問題,我想追加一個克隆,而不是:
templatePlaceholder.append(listTemplate.clone());
這成功阻止listTemplate腳本被移除,然而,克隆副本包含的腳本標籤,但不是其內容,因此表中的數據仍然沒有得到加載。我尋遍SO,發現約翰Resig的,以this question迴應:
所以我改變了上面的代碼:
var listTemplateCopy = jQuery.extend({}, listTemplate);
templatePlaceholder.append(listTemplateCopy);
這成功複製腳本標記及其內容listTemplateCopy但附加()刪除listTemplate以及作爲listTemplateCopy。起初,我認爲這是因爲擴展旨在將兩個(或更多)對象合併成一個對象,但是從John的響應和我在文檔中讀到的內容來看,它聽起來像擴展是你應該使用的創建一個jQuery對象的副本。
任何人都可以向我解釋究竟是怎麼回事,並建議上述解決方案?
一對夫婦的想法,我有是:
- 移腳本標籤,從而只圍繞模板代碼。然後我可以有第二個模板代碼,而不需要追加它。綁定將通過綁定到下拉列表模板,然後綁定到表
- 使用不同的方式來填充下拉列表而不是模板來簡化頁面並刪除「添加腳本」的「必要性」 ,因爲不會有一個腳本標籤圍繞整個地段
我想了解在執行這兩種方法之前,代碼正在做什麼。
謝謝:)我懷疑同樣的DOM元素被引用裏面使用擴展,但不確定。您的建議與將腳本添加到腳本中稍有調整(否則在下次載入表格數據時無法找到)有關。 –