2017-08-13 123 views
0

我無法獲得嵌套的foreach工作。我有以下代碼:嵌套的foreach將不起作用

HTML - 摘錄

<div data-bind='foreach: choice'> 
    <p data-bind='foreach: id'> 
     <input name="group1" type="radio" data-bind="attr: { id: $data }"/> <label data-bind="attr: { for: $data} "> <span data-bind=" text: $data"> </span> 
     </label> 
    </p> 
</div> 

使用Javascript - 摘錄

var questionModel = { 
question : ko.observable(), 
id: ko.observableArray(), 
choice: ko.observableArray() 
} 

function startTest() { 
    questionModel.question(questions[questionNo].question); 
    var m = []; 
    var i = []; 

    var e = 0; 
    while (e != 4) { 
     m.push(choices[questionNo][e].choice); 
     i.push(choices[questionNo][e].id); 
     e++; 
    } 

    questionModel.choice(m); 
    questionModel.id(i); 
} 

基本上就是我要完成的是一個單選按鈕內生成的每個選擇使數組中的ID成爲單選按鈕和標籤的ID。我已經成功地顯示了它自己的選擇。但是,當我加入了數據綁定= '的foreach:身份證' & 數據綁定= 'ATTR:{ID:$數據}',這是當事情停止工作。我不斷收到錯誤如下:

ReferenceError: Unable to process binding "foreach: function(){return id }" Message: id is not defined

免責聲明:我測試過的數據和一切爲了陣列的罰款。

+0

我覺得PROBL em是你正在創建兩個不是真正嵌套的數組。 'id'是'choice'對象的一個​​屬性。嘗試刪除段落標記'

'並查看它是否有效。 – styfle

+0

@styfle單選按鈕ID與上述解決方案的選擇相同,這不是我正在尋找的。該id不是選擇對象的屬性。我正在尋找的是這個。我有選擇陣列('水','空氣','土地','海')和id陣列('1','2','3','4')。單選按鈕應該是'水',ID是'1',下一個單選按鈕應該是'空',ID是'2',等等。 – DanielleS

+0

你想要4個輸入:'水:1,空氣:2,陸地:3,海:4'?或者你想要16個輸入:'水:1,空氣:1,陸地:1,海:1,水:2,空氣:2,陸地:2,海:2 ...'? – styfle

回答

0

您應該爲模型添加一個類似{id: 1}的選擇數組。然後你可以遍歷所有的選擇和參考id屬性,像這樣:

var questionModel = { 
 
    question: ko.observable(), 
 
    choice: ko.observableArray() 
 
} 
 

 
function startTest() { 
 
    questionModel.question(questions[questionNo].question); 
 
    var m = []; 
 
    var e = 0; 
 
    while (e != 4) { 
 
    var choice = choices[questionNo][e]; 
 
    m.push(choice); 
 
    e++; 
 
    } 
 

 
    questionModel.choice(m); 
 
}
<div data-bind="foreach: choice"> 
 
    <p> 
 
    <input name="group1" type="radio" data-bind="attr: { id: id }" /> 
 
    <label data-bind="attr: { for: id }"> 
 
     <span data-bind="text: id"> </span> 
 
     </label> 
 
    </p> 
 
</div>

+0

在此處查看文檔:http://knockoutjs.com/documentation/foreach-binding.html – styfle

+0

我認爲你誤解了我解釋的所有內容或誤解了代碼。代碼中已經有一個ID數組。我只需要將它們添加爲單選按鈕的ID。您的上述解決方案沒有提供任何方法讓選擇本身顯示爲單選按鈕的標籤。注意到我在questionModel中有一個id數組。 – DanielleS

2

我不使用你的代碼佈局對不起,我找不到其中的問題被宣佈或在綁定被應用。我在這裏用一個簡單的3項數據模型QuestionModel和一個包含它的簡單視圖模型做了一個例子。

數據模型只包含問題的ID,問題本身(title),然後是該問題的選項。遍歷每個問題,然後循環每個選擇。如果你願意,你可以擴大價值的選擇或其他。只需製作一組對象。

[{ 
    "AnswerText": "Blue", 
    "AnswerValue" : "#0000FF" 
}] 

function QuestionModel(data) { 
 
    var self = this; 
 

 
    self.Id = ko.observable(data.Id); 
 
    self.Title = ko.observable(data.Title); 
 
    self.Choices = ko.observableArray(data.Choices); 
 

 
} 
 

 
function ViewModel() { 
 
    var self = this; 
 

 
    self.Questions = ko.observableArray([ 
 
    new QuestionModel({ 
 
     "Id": 1, 
 
     "Title": "What color are rabbits?", 
 
     "Choices": ["Red", "Blue", "Green"] 
 
    }), 
 
    new QuestionModel({ 
 
     "Id": 2, 
 
     "Title": "What color are dogs?", 
 
     "Choices": ["Silver ", "Golden", "Striped"] 
 
    }), 
 
    new QuestionModel({ 
 
     "Id": 3, 
 
     "Title": "What color are cats?", 
 
     "Choices": ["white", "Black", "Orange"] 
 
    }) 
 
    ]); 
 

 
} 
 
ko.applyBindings(new ViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script> 
 
<div data-bind="foreach: Questions"> 
 
    <span data-bind="text: Title"> </span> 
 
    <div data-bind="foreach: Choices"> 
 
    <input type="radio" data-bind="value: $data, attr : {name : $parent.Id}" /> 
 
    <span data-bind="text: $data"></span> 
 
    <br> 
 
    </div> 
 
</div>