2016-06-10 32 views
0

我正在面對Knockout的下列問題。我有一個列表,其中包含一些值。這一切都很好,我得到我的下拉項目就好了。它還具有點擊功能,可以記錄正在點擊的內容的值。這與console.log正常工作,但它絕對拒絕更新我設置的KO可觀察值。如果我將<ul>中的HTML中的<a>行移動到頁面的不同部分,它只會在其位於<ul>內部時被擰緊,它的工作原理沒有問題。同樣,如果我告訴Javascript更新「dropdownSelectedA3」值與某些東西,如果不同的按鈕被點擊。我在想這是在錯誤的地方或東西看,但我似乎無法弄清楚這一點。Knockout JS在foreach內拋出「不是函數」錯誤

也試過:

  • 更改 「this.dropdownSelectedA3(answerUserA3)」 到 「viewmodel.dropdownSelectedA3(answerUserA3)」,但出現同樣的問題
  • 刪除$父也不能解決問題,遺憾的是

有人可能會指出我的錯誤嗎?

我的代碼:

相關HTML:

<ul class="dropdown-menu" aria-labelledby="dropdownMenu3UL" data-bind="foreach: dropdownAnswersAssignment3"> 
     <li> 
      <a data-bind="text: $data, click: $parent.logAnswerA3" href="#"></a> 
     </li> 
     </ul> 

相關JS(在我的視圖模型):

this.dropdownAnswersAssignment3 = ko.observableArray([C1M5OptionsActive.A3.option1, C1M5OptionsActive.A3.option2, C1M5OptionsActive.A3.option3, C1M5OptionsActive.A3.option4]); 

var answerUserA3 

this.dropdownSelectedA3 = ko.observable("..."); 

this.logAnswerA3 = function(answer) { 
    answerUserA3 = answer; 
    this.dropdownSelectedA3(answerUserA3) 
} 
+0

哪裏是'dropdownAnswersAssignment3'在你的模型?你能在這裏展示 –

+0

Appologies,更新。 –

+0

範圍問題,'logAnswerA3'函數中的'this'引用函數本身,因此與該函數外部的'this'不同。 – GillesC

回答

0

如果你要綁定單擊foreach循環內的事件,無論是你需要在你的虛擬機中有你的數組存在的點擊函數,或者你可以通過嵌套的View Model引用它到父視圖模型,這樣你就可以請將click event發送給您的父虛擬機。事實上,對於您的陣列中的每個元素創建的itemViewModel一個新的實例,然後他們每個人的指向父點擊功能
舉例:https://jsfiddle.net/9aLvd3uw/234/

HTML:

<ul data-bind="foreach: dropdownAnswersAssignment3"> 
    <li> 
     <a data-bind="click:$parent.logAnswerA3,text: name"></a> 
    </li> 
</ul> 

JS:

var itemViewModel = function(text){ 
var self = this; 
self.name = ko.observable(text); 
} 
function demoViewModel() { 
    var self = this; 
    //fake data 
    var arr = [ 'Click A', 'Click B', 'Click C']; 
    self.logAnswerA3 = function (item){ 
    alert(item.name() + " just Cliked"); 
    } 
    self.dropdownAnswersAssignment3 = ko.observableArray($.map(arr, function (element) { 
     return new itemViewModel(element); 
    })); 
} 
var mm = new demoViewModel(); 

ko.applyBindings(mm); 
+0

謝謝你的好概述,它是「var self = this」,我沒有完全理解。 –

0

如果我理解了你的問題,你只需要點擊它時將列表的一個對象放在一個可觀察對象中。你可以這樣:

var ViewModel = function() { 
 
    var self = this; 
 

 
    self.objectClicked = ko.observable("..."); 
 
    self.objectList = ko.observableArray(["Object 1", "Object 2", "Object 3"]); 
 

 
    self.click = function(data) { 
 
    self.objectClicked(data); 
 
    } 
 
} 
 

 
var viewModel = new ViewModel(); 
 
ko.applyBindings(viewModel);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 

 
<ul data-bind="foreach: objectList"> 
 
    <li> 
 
    <a data-bind="text: $data, click: $root.click"></a> 
 
    </li> 
 
</ul> 
 
<p data-bind="text: $root.objectClicked"></p>

+0

謝謝!希望接受你的答案。 –

相關問題