如何使用可能不是数组的嵌套对象进行挖空

时间:2014-08-02 09:45:24

标签: javascript arrays knockout.js

我有一个这种形式的嵌套JSON对象

var termValues=[
    {
   clause_title:"One",
   clause_id:"One",
CM_terms: [
            { termName: 'CompanyName', type:"text", termValue:"CompanyName1", termId:'1' },
            { termName: 'Contract termValue', type:"number", termValue:"1234",termId:'2' },
            { termName: 'Contract End', type:"date", termValue:"2012-02-02", termId:'3'  }
          ]
    },
    {
    clause_title:"Two",
    clause_id:"Two",
CM_terms: [
            { termName: 'CompanyName', type:"text", termValue:"CompanyName2", termId:'4' },
            { termName: 'Contract termValue', type:"number", termValue:"5678",termId:'5' },
            { termName: 'Contract End', type:"date", termValue:"2011-02-02", termId:'6'  }
          ]


    }
];

我以这种形式申请了绑定

function TestModel (termValues)
{
var self=this;
self.Clauses=ko.observableArray(termValues)
}
ko.applyBindings(new TestModel(termValues),$("#ctrTerms1")[0]);

HTML code:

<div data-bind="foreach: Clauses" id="ctrTerms1">
    <div class="panel">
        <div class="control-bar panel-heading">
            <h4 class="panel-title" style="overflow:auto">
                <a class="col-md-12 clref">
                    <span class="clause-title" title="Click to edit" data-bind="text: Clauses.clause_title"></span>
                </a>
            </h4>
        </div>
        <div>
            <div class="panel-body">
             <form class="form-horizontal" role="form" data-bind="foreach: CM_terms">
                <div class="form-group"  >
                    <label class="col-md-2 control-label" data-bind="text: termName">Title</label>
                    <div class="col-md-9">
                        <input type="text" class="form-control cttermValue" id="clauseTitle" data-bind="value: termValue">
                    </div>

                 </div>
            </form>
            </div>
            </div>
        </div>
    </div>

现在的问题是,如果我有超过1个术语,那么CM_terms将以数组的形式存在,因此每个CM_terms都可以工作,但如果我只有1个CM_terms(单个对象),则敲除不能绑定为CM_term将不是数组。

var termValues=[
    {
   clause_title:"One",
   clause_id:"One",
CM_terms: 
            { termName: 'CompanyName', type:"text", termValue:"companyName1", termId:'1' }
];

我如何制作&#39; CM_term&#39;如果是单个对象,则转换为Array的值。 截至目前,我正在迭代termValues并将CM_terms设为Array,如果它不是数组,然后应用Bindings。

还有其他办法。

2 个答案:

答案 0 :(得分:0)

如果您有单个对象,则将其推入阵列。在你的情况下,CM_terms总是应该是一个数组,无论它是单个对象还是多个对象。

var termValues=[
{
    clause_title: "One",
    clause_id: "One",
    CM_terms: [
        {
            termName: 'CompanyName',
            type: "text",
            termValue: "Cordys",
            termId: '1'
        }
    ]
];

Fiddle Demo

答案 1 :(得分:0)

这就是我们如何解决问题的方法。从其中一个堆叠流动的帖子中得到了线索(如果找到了增益则会发布)

我们可以使用data-bind =&#34; foreach:{data:$ data.CM_Terms}&#34;。即使CM_Terms不是数组

,我们也能得到理想的结果
<div class="panel-body" data-bind="foreach: {data:$data.CM_terms}">

JSFiddle