我正在研究原型问卷系统。通过电话询问客户问题。
使用HTML,JS,KO(以及动态CRM作为数据源)。
请注意,我是KO的新手,因为这是第2天! - 我印象深刻,认为它似乎有一个EVE-Online学习曲线!
问题存储在Dynamics CRM中,并通过OData调用(返回JSON)进行检索。
有些问题存在子问题,因此我对原始规范化的OData结果进行去规范化,并在新的JSON对象中设置层次结构。对此对象进行调试显示其全部表示为预期。像树一样。
我遇到的问题是,当我尝试将视图用于某个深度时,我得到了一个。 “错误:无法获取未定义或空引用的属性'值'
我查看了这篇文章 Knockout.js Make every nested object an Observable ,这似乎与我的问题有关,但是我的代码中的解决方案不适合我,我可能误解了我的问题!
我的观点正确地显示了第一级问题,但是孩子的问题只能解决问题。所以当我尝试数据绑定 data-bind =“value:adr_nextquestionyesid()。adr_answertype.Value 时,我得到上面显示的空引用错误。
但是,如果我数据绑定此 data-bind =“值:adr_nextquestionyesid()。adr_answertype ,我会在视图中看到”[Object object]“。这对我来说表明它应该能够获取adr_answertype的int值!
顶级adr_answertype.Value绑定工作正常,这似乎是一个问题,因为我深入了解对象。
这是我的ViewModel&模型;
请注意,下一个问题应该是(并且在JSON中)问题中的实际嵌套问题,正如您可以想象的那样可以任意深入
function QuestionAnswersVM() {
var self = this;
var questionDataRaw = RetrieveQuestionSet("15AF22A6-3E58-E411-B2A6-00155DFD8300", odataPath);
var questionDataOrganised = OrganiseQuestionHierarchy(questionDataRaw);
self.questions = ko.mapping.fromJS(questionDataOrganised, mapping);
};
var mapping = {
create: function (options) {
return new Question(options.data);
}
};
function Question(data) {
ko.mapping.fromJS(data, {}, this);
// Answers
this.DateTime = ko.observable(data.DateTime);
this.FreeText = ko.observable(data.FreeText)
this.YesNo = ko.observable(data.Yes);
// Next questions - trying to create nested question here
this.adr_nextquestionyesid = ko.observable(new Question(data.adr_nextquestionyesid));
}
这是我的观点(删除了不相关的内容);
特别注意QuesionBoxIndent div中出现问题的数据绑定
<section data-bind="foreach: questions">
<div class="questionBox">
<span class="questionTitle"><span data-bind="text: adr_name"></span></span>
<div class="questionBody">
<label data-bind="text: adr_questionbody" />
</div>
<div data-bind="visible: adr_answertype().Value == 1">
<input data-bind="checked: YesNo" type="radio" value="true" />Yes
<input data-bind="checked: YesNo" type="radio" value="false" />No
<label class="mandatory" data-bind="visible: $data.adr_mandatory()"><b>*</b></label>
</div>
<div data-bind="visible: adr_answertype().Value == 2">
<input data-bind="value: FreeText" type="text" name="fname" />
<label class="mandatory" data-bind="visible: $data.adr_mandatory()"><b>*</b></label>
</div>
</div>
<div class="questionBoxIndent" data-bind="visible: adr_nextquestionyesid().adr_name != null">
<span class="questionTitle"><span data-bind="text: adr_nextquestionyesid().adr_name"></span></span>
<div class="questionBody">
<label data-bind="text: adr_nextquestionyesid().adr_questionbody" />
</div>
<div>
<input data-bind="value: adr_nextquestionyesid().FreeText" type="text" name="fname" />
<input data-bind="value: adr_nextquestionyesid().adr_answertype" type="text" name="fname" />
<input data-bind="value: adr_nextquestionyesid().adr_answertype.Value" type="text" name="fname" />
<label class="mandatory" data-bind="visible: adr_nextquestionyesid().adr_mandatory"><b>*</b></label>
</div>
</div>
<br />
编辑:花了一天时间,我想我已经使用Sergiu的建议破解了它,使用映射插件。我最终得到了这个地图,但看起来它并没有暴露出我认为它的深度。基本上,当尝试访问嵌套问题的adr_answertype上的值时,我得到相同的“错误:无法获取未定义或空引用的属性'值'。我尝试了各种各样的视图语法变体来访问Value。即使它在使用调试器查看原始映射对象时肯定存在。也许我应该完全手动构建模型,这将是一个单独的研究流,我的阅读只告诉我如何声明顶级模型!
非常感谢所有人!
和平