Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Knockout.js在查看对象中的对象时出现问题_Javascript_Html_Json_Knockout.js_Dynamics Crm 2011 - Fatal编程技术网

Javascript Knockout.js在查看对象中的对象时出现问题

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对象中设置层次结构。在此对象上进行调试将显示其所有内容,如预期的那样。像树一样 我的问题是,当我尝试使用视图到某个深度时,我会得到一个错误。 错误:

我正在开发一个原型问卷系统。通过电话向客户提问

使用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中的数据绑定,这会导致问题


对
不
*
*
*

编辑:花了一天的时间在上面,我想我已经用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 />