Javascript Knockout.js在查看对象中的对象时出现问题
我正在开发一个原型问卷系统。通过电话向客户提问 使用HTML、JS、KO(以及作为数据源的动态CRM) 请注意,我是KO的新手,因为这是第2天我印象深刻,认为它似乎有一个EVE在线学习曲线 这些问题存储在Dynamics CRM中,并通过OData调用(返回JSON)检索 有些问题有子问题,所以我将原始的标准化OData结果反标准化,并在新的JSON对象中设置层次结构。在此对象上进行调试将显示其所有内容,如预期的那样。像树一样 我的问题是,当我尝试使用视图到某个深度时,我会得到一个错误。 错误:无法获取未定义或空引用的属性“值” 我看了这篇文章,它似乎与我的问题有关,但将该解决方案重新装配到我的代码中对我不起作用,我可能误解了我的问题 我的观点正确地显示了第一级问题,但儿童问题只在一定程度上起作用。因此,当我尝试数据绑定这个data bind=“value:adr\u nextquestionyesid().adr\u answertype.value时,我得到了上面显示的空引用错误 但是,如果我数据绑定此data bind=“value:adr\u nextquestionyesid().adr\u answertype我会在视图中看到“[Object Object]”。这对我来说意味着它应该能够得到adr_answertype的int值 顶级adr_answertype.Value绑定工作正常,随着我对对象的深入,这似乎是一个问题 这是我的视图模型&Model强> 请注意,接下来的问题(在JSON中)实际上是嵌套在问题中的问题,正如您所想象的,这些问题可以任意深入 以下是我的观点(删除无关内容)强> 请特别注意QuesionBoxIndent div中的数据绑定,这会导致问题Javascript Knockout.js在查看对象中的对象时出现问题,javascript,html,json,knockout.js,dynamics-crm-2011,Javascript,Html,Json,Knockout.js,Dynamics Crm 2011,我正在开发一个原型问卷系统。通过电话向客户提问 使用HTML、JS、KO(以及作为数据源的动态CRM) 请注意,我是KO的新手,因为这是第2天我印象深刻,认为它似乎有一个EVE在线学习曲线 这些问题存储在Dynamics CRM中,并通过OData调用(返回JSON)检索 有些问题有子问题,所以我将原始的标准化OData结果反标准化,并在新的JSON对象中设置层次结构。在此对象上进行调试将显示其所有内容,如预期的那样。像树一样 我的问题是,当我尝试使用视图到某个深度时,我会得到一个错误。 错误:
对
不
*
*
*
编辑:花了一天的时间在上面,我想我已经用Sergiu的建议破解了它,使用了映射插件。我最终得到了那张地图,但它似乎没有暴露出我所认为的深度。基本上,当尝试访问嵌套问题的adr_answertype上的值时,我会得到相同的“错误:无法获取未定义或空引用的属性'value'”。我尝试了视图语法的各种变体来访问该值。即使它在使用调试器查看原始映射对象时确实存在。也许我应该考虑完全手动构建模型,这将是一个独立的研究流,我的阅读只是告诉我如何声明顶级模型
谢谢大家
和平为什么有时使用
adr\u answertype().Value
而其他时候使用adr\u answertype.Value
?你知道一个可观察对象是如何工作的,对吧?最后一块输入控件有不同的语法来判断我是否有什么错误。我对淘汰赛的了解是零碎的,因为它只有第二天,已经跑了很多教程等等。最后一个div(没有数据绑定的div)将类似于第一个问题框中的div,它们将通过data bind=“visible:adr\u nextquestionyesid().adr\u answertype.Value==1进行数据绑定。例如,您访问一个可观察对象的值,如下所示:someObservable()
。接下来,您有一个值
属性。如果该属性不是可观察属性(您似乎没有通过调用可观察属性(值()
)来访问它的值)那么knockout是如何知道它发生了变化的呢?在我看来,你需要某种深度观察,或者手动将该数据结构映射到一个可观察的数据结构。谢谢Sergiu,深度观察是我研究的重点。因此调查……我会一直保留这个问题,直到我破解它或者有人发布一个明确的答案。谢谢你G下载映射插件。
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));
}
<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 />