我正在研究这个项目原型。现在,当前部分正在处理敲除js的“多重绑定”问题。我已经阅读了不同的方法,其中包括在HTML中引用数据模型时使用“ with”语句。我还阅读了在处理各种数据模型以进行渲染时使用clearNode可能是另一种可能的解决方案。这是有关我当前问题的一些事实。
我尝试使用“ with”语句“敲出”每个敲除模板的确切模型,但是我在想,因为它们仅在函数调用期间被实例化而无法访问?我不知道如何开始重构代码以能够使用“ with”语句。
我也尝试过clearNode,通过在根目录中包含一个id名称(其中敲除项声明数据模型的名称),在第二次KO渲染期间在clearNode中使用id……想法是可以清除然后重用同一节点。尽管在我提供的代码段中,我在透明节点中使用了“模板”,因为我尝试了每个节点,所以碰巧这是我尝试的最后一个节点
我还读到在'.applyBindings'期间,我是否可以包括元素名称以也包括它?我尝试了几件事都没有成功。
JS
//functions.js
function resultDisplay() {
parseJsonWithSelect();
var self = this;
self.data = ko.observableArray(jresponse);
}
function questionDisplay() {
var self = this;
var mappedData = qna.map(function(item) {
item.optionGroupName = "optionGroup_" + item.questionId;
item.selectedAnswer = ko.observable();
return item;
});
self.data = ko.observableArray(mappedData);
}
function initResultDisplay() {
var dataModel = new resultDisplay();
ko.cleanNode("template");
ko.applyBindings(dataModel);
$("#searchResultDisplay").modal("show");
}
function initQuestionDisplay() {
$("#inBetween").modal("hide");
var qnaDataModel = new questionDisplay();
$("#questionsDisplay").modal("show");
ko.applyBindings(qnaDataModel);
}
HTML
<!-- Questions modal -->
<div
class="modal fade"
id="questionsDisplay"
tabindex="-1"
role="dialog"
aria-labelledby="questionsDisplayLabel"
aria-hidden="true"
>
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="questionsDisplayLabel">
QUESTIONS
</h5>
<button
type="button"
class="close"
data-dismiss="modal"
aria-label="Close"
>
<span aria-hidden="true">×</span>
</button>
</div>
<div
class="modal-body"
data-bind="template: {name: 'template', data: $data}"
></div>
<script type="text/html" id="template">
<div class="diplay-frame" data-bind="foreach: {data: data, as: '_data'}">
<div class="question-box">
<h2 class="question" id="ques" data-bind="text: _data['question']"/>
<div data-bind="foreach: {data: _data['answers'], as: 'answer'}">
<input type="radio" id="ans" data-bind="checked: $parent.selectedAnswer, attr:{name: $parent.optionGroupName, value: $data}" />
<span data-bind="text: answer"/>
</div>
</div>
</div>
</script>
<button
type="button"
onclick="captureAnswers()"
class="btn btn-secondary"
data-dismiss="modal"
>
Next
</button>
</div>
</div>
</div>
<!-- Search result Display Modal -->
<div
class="modal fade"
id="searchResultDisplay"
tabindex="-1"
role="dialog"
aria-labelledby="searchResultDisplayLabel"
aria-hidden="true"
>
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="searchResultDisplayLabel">
Search Results
</h5>
<button
type="button"
class="close"
data-dismiss="modal"
aria-label="Close"
>
<span aria-hidden="true">×</span>
</button>
</div>
<div
class="modal-body"
data-bind="template: {name: 'template', data: $data}"
></div>
<script type="text/html" id="template">
<div class="diplay-frame" data-bind="foreach: {data: data, as: '_data'}">
<div class="result-box">
<div class="bgtint"></div>
<section class="businesscard">
<div class="flip">
<div class="front">
<div class="logo">
<img class="profile_image" width="50px" height="50px" data-bind="attr:{src: _data['profile_image']}"/>
<h2 class="user_name" data-bind="text: _data['username']"/>
<div class="introduction">COMPANY NAME GOES HERE!</div>
<div class="arrow"></div>
</div>
</div>
<div class="userinfo">
<ion-icon name="call">PHONE</ion-icon>
<div class="name">
</div>
</div>
</section>
</div>
</div>
</script>
</div>
<div class="modal-footer">
</div>
</div>
</div>
`
答案 0 :(得分:1)
是的,您不能在整个文档上两次调用applyBindings
并期望不再使用它;-)但是此方法确实可以将元素作为其第二个参数,因此绑定仅应用于该元素。因此,您可以致电:
ko.applyBindings(dataModel, document.querySelector('#searchResultDisplay'));
并且:
ko.applyBindings(qnaDataModel, document.querySelector('#questionsDisplay'));