2012-02-07 59 views
1

我想使用KnockoutJS綁定一對多映射,其中1個郵政編碼可以有許多'代理'。我有以下類:KnockoutJS在模型上選擇

function CaseAssignmentZipCode(zipcode, agent) { 
    var self = this; 
    self.zipcode = ko.observable(zipcode); 
    self.agent = ko.observable(agent); 
} 

function Agent(id, name) { 
    var self = this; 
    self.id = id; 
    self.name = name; 
} 

function ZipcodeAgentsViewModel() { 
    var self = this; 
    self.caseAssignmentZipCodes = ko.observableArray([]); 
    self.agents = ko.observableArray([]); 

    jdata = $.parseJSON($('#Agents').val()); 
    var mappedAgents = $.map(jdata, function (a) { return new Agent(a.Id, a.Name) }); 
    self.agents(mappedAgents); 

    var dictAgents = {}; 
    $.each(mappedAgents, function (index, element) { 
    dictAgents[element.id] = element; 
    }); 

    var jdata = $.parseJSON($('#CaseAssignmentZipCodes').val()); 
    var mappedZipcodeAgents = $.map(jdata, function (za) { return new CaseAssignmentZipCode(za.ZipCode, dictAgents[za.UserId], false) }); 
    self.caseAssignmentZipCodes(mappedZipcodeAgents); 
} 

var vm = new ZipcodeAgentsViewModel() 
ko.applyBindings(vm); 

我的綁定是這樣的:

<table> 
    <thead><tr><th>Zipcode Agents</th></tr></thead> 
    <tbody data-bind="foreach: caseAssignmentZipCodes"> 
    <tr> 
     <td><input data-bind="value: zipcode"></td> 
     <td><select data-bind="options: $root.agents, value: agent, optionsText: 'name'"></select></td> 
     <td><a href="#" class="image-button small delete-small no-text" data-bind="click: $root.removeZipcode">Remove</a></td> 
    </tr> 
    </tbody> 
</table> 

一切結合精緻的第一次,與該表選擇字段顯示正常。但是,當我更改任何選擇元素上的選定值時,沒有任何反應。我綁定了其他元素給他們,這些不會更新,我嘗試使用.subscribe()來偵聽更新事件,但是這也不會觸發。

我希望我設置/綁定這些關係的方式有些問題,但我無法想象它能拯救我的生命。

謝謝!

回答

2

我認爲你需要在ZipcodeUsersViewModel

+1

啊廢話的頂部添加

self.agents = ko.observableArray([]); 

,這是我不好。複製了錯誤的代碼塊,所以我有一半的用戶和一半的代理。對不起,我認爲現在一切正確。 – Joel 2012-02-07 19:50:56

+0

以下是您在jsfiddle上的示例:http://jsfiddle.net/jHBX3/如果您在上面的選擇中更改了值,它也會在下面更改。 – Geoff 2012-02-07 20:21:06