Knockout.js在查看对象内的对象时遇到问题

时间:2014-10-22 09:40:07

标签: javascript html json knockout.js dynamics-crm-2011

我正在研究原型问卷系统。通过电话询问客户问题。

使用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。即使它在使用调试器查看原始映射对象时肯定存在。也许我应该完全手动构建模型,这将是一个单独的研究流,我的阅读只告诉我如何声明顶级模型!

非常感谢所有人!

和平

0 个答案:

没有答案