2

这是有问题的jsfiddle:http: //jsfiddle.net/a28aP/5/

视图模型:

{
 "pitalice": [{
     "pitanje": "Kako se zove rezultat koji se dobija deljenjem dva broja",
     "ponudjeno": ["Kolicnik", "Suma", "Proizvod"],
     "tacan": 0
 }, {
     "pitanje": "Limonit je ruda",
     "ponudjeno": ["Aluminijuma", "Olova", "Gvožda"],
     "tacan": 2
 }, {
     "pitanje": "Ko je komponovao operu 'Samson I Dalila'",
     "ponudjeno": ["Žorž Bize", "Ðuzepe Verdi", "Kamij Sen-Sans"],
     "tacan": 2
 }, {
     "pitanje": "Ko je autor satiricnih pripovedaka 'Danga', 'Kraljevic Marko po drugi put medu Srbima' i drugih",
     "ponudjeno": ["Milovan Glišic", "Laza Lazarevic", "Radoje Domanovic"],
     "tacan": 2
 }, {
     "pitanje": "Koje godine je u Atini održana prva Olimpijada 'modernog doba'.",
     "ponudjeno": ["1896.", "1898.", "1900."],
     "tacan": 0
 }]

};

HTML:

<div data-bind="foreach: pitalice" class="divPitalice">
<div class="divPitanje">
    <input type="text" data-bind="value: pitanje" style="width: 600px" />
    <div data-bind="foreach: ponudjeno">
        <input type="text" data-bind="value: $data" />
        <input type="radio" data-bind="attr: { name: $parentContext.$index, value: $index }, checked: $parent.tacan" />
        <br />
    </div>
</div>

如您所见,对大文本框的更改很好地传播到视图模型。

但是,如果您更改较小的文本框并单击保存,则这些更改不会保存在视图模型中。

为什么?

谢谢!

4

3 回答 3

3

ko.mapping插件仅映射数组和对象(它们分别成为 observableArray 和 observable)。您的答案数组是纯字符串,不被视为对象。

只需将您的字符串数组转换为对象数组:

var dataObj = {
    "pitalice": [{
        "pitanje": "Kako se zove rezultat koji se dobija deljenjem dva broja",
        "ponudjeno": [ { text: "Kolicnik" }, { text: "Suma" }, { text: "Proizvod" } ],
        "tacan": 0
    },
    .....

http://jsfiddle.net/a28aP/11/

于 2013-05-21T18:35:37.770 回答
1

不确定问题是什么,它可能与 observableArrays 有关,但这里有一个带有解决方法的 JSFiddle

我基本上将您的数组项包装在这样的对象中:

 var dataObj = {
 "pitalice": [{
     "pitanje": "Kako se zove rezultat koji se dobija deljenjem dva broja",
     "ponudjeno": [{ name: "Kolicnik" }, { name: "Suma"}, { name: "Proizvod"}],
     "tacan": 0
 }, {
     "pitanje": "Limonit je ruda",
     "ponudjeno": [{ name: "Aluminijuma"}, { name: "Olova"}, { name: "Gvožda"}],
     "tacan": 2
 }, {
     "pitanje": "Ko je komponovao operu 'Samson I Dalila'",
     "ponudjeno": [{ name: "Žorž Bize"}, { name: "Ðuzepe Verdi"}, { name: "Kamij Sen-Sans"}],
     "tacan": 2
 }, {
     "pitanje": "Ko je autor satiricnih pripovedaka 'Danga', 'Kraljevic Marko po drugi put medu Srbima' i drugih",
     "ponudjeno": [{ name: "Milovan Glišic"}, { name: "Laza Lazarevic"}, { name: "Radoje Domanovic"}],
     "tacan": 2
 }, {
     "pitanje": "Koje godine je u Atini održana prva Olimpijada 'modernog doba'.",
     "ponudjeno": [{ name: "1896."}, { name: "1898."}, { name: "1900."}],
     "tacan": 0
 }]
};

并在 HTML 中将 $data 更改为 $data.name:

<h2>Pitalice</h2>
  <div data-bind="foreach: pitalice" class="divPitalice">
  <div class="divPitanje">
    <input type="text" data-bind="value: pitanje" style="width: 600px" />
    <div data-bind="foreach: ponudjeno">
        <input type="text" data-bind="value: $data.name" />
        <input type="radio" data-bind="attr: { name: $parentContext.$index, value: $index}, checked: $parent.tacan" />
        <br />
      </div>
    </div>
  </div>
  <button onclick="alert(ko.mapping.toJSON(window.kViewModel));">Save</button>
于 2013-05-21T18:30:31.053 回答
0

欢迎来到 SO!

它不会跟踪值的更改,因为它们不是对象或属性,而只是字符串列表。所以没有什么可以更新的。我分叉了您的 jsfiddle,并将其从字符串列表更改为具有 name 属性的对象列表,并且它已正确更新。这是更新的小提琴 和下面的示例:

 {
     "pitanje": "Kako se zove rezultat koji se dobija deljenjem dva broja",
     "ponudjeno": [{name:"Kolicnik"}, {name:"Suma"}, {name:"Proizvod"}],
     "tacan": 0
 },
于 2013-05-21T18:37:42.700 回答