2012-11-22 17 views
6

पर नहीं चुना गया है, मैं उपयोगकर्ता के लिए एक संपादन फ़ॉर्म बना रहा हूं, उपयोगकर्ता की भूमिकाएं एकाधिक चयन में डिफ़ॉल्ट रूप से नहीं चुनी जाती हैं।नॉकआउट एकाधिक चयन चयनित विकल्प लोड

2 आवेदन भूमिकाएं हैं: "व्यवस्थापक" और "मॉडरेटर"। नमूना उपयोगकर्ता के पास 1 भूमिका "प्रशासक" है। यह डिफ़ॉल्ट रूप से नहीं चुना जाता है।

http://jsfiddle.net/jgT8s/4/

एचटीएमएल:

<form data-bind="with: user"> 
    <select id="selectRoles" 
     data-bind="options: $root.allRoles, selectedOptions: Roles, optionsText: 'Name', optionsValue: 'Id'" 
     multiple="true" 
     size="5"> 
    </select> 
</form> 

js:

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

    self.Id = ko.observable(1337); 
    self.Username = ko.observable('pietpaulusma'); 
    self.Roles = ko.observableArray([{ Id: 1, Name: 'Administrator' }]); 
}; 

function UserViewModel() { 
    var self = this; 

    self.user = ko.observable(new User()); 
    self.allRoles = ko.observableArray([{ Id: 1, Name: 'Administrator' }, { Id: 2, Name: 'Moderator' }]); 
} 

ko.applyBindings(new UserViewModel()); 

अद्यतन एक dependentObservable बनाया है और मैप की गई है कि selectedOptions करने के लिए एक

self.RoleIds = ko.dependentObservable(function() { 
     return ko.utils.arrayMap(self.Roles(), function (role) { 
      return role.Id; 
     }); 
    }); 

काम कर संस्करण: optionsValue: 'Id': http://jsfiddle.net/jgT8s/5/

+0

यह निर्भर ओब्सर्वेबल के बारे में एक महान युक्ति है .. शर्म की हमें ऐसी लंबाई में जाना है .. –

उत्तर

6

समस्या यह है कि Roles होता है "पूर्ण" वस्तु, जबकि यह केवल मूल्य हिस्सा शामिल करना चाहिए:

self.Roles = ko.observableArray([1]); 

एक नज़र यहाँ ले लो: http://jsfiddle.net/Vkda5/

+1

thanx! मैंने एक आश्रित ऑब्सर्वेबल बनाया है जो भूमिकाओं के सभी आईडी लौटाता है http://jsfiddle.net/jgT8s/5/ अच्छा होगा अगर नॉकआउट विकल्पों के साथ ऑब्जेक्ट मैप किया गया है। – Bas

+0

@ बास: मैं सहमत हूं - 'विकल्प वैल्यू' का उपयोग करके लगातार बढ़िया होगा। –

3

नॉकआउट मूल्यों, जो इस मामले में Id है द्वारा चयनित विकल्पों की तुलना करने की जरूरत है। और आप Role ऑब्जेक्ट्स की सरणी पास कर रहे हैं। इसके बजाय आप Id की सरणी पारित करने के लिए की जरूरत है:

var User = function() { 
    ... 
    self.Roles = ko.observableArray([1]); 
}; 
+0

पहले उत्तर दिया लेकिन स्वीकार्य उत्तर नहीं .. ?? मुझसे +1 –

+0

क्या किसी को पता है कि वस्तुओं के बजाय केवल आईडी कैसे हैं? – AlexRebula

+0

यहां महत्वपूर्ण बात यह है कि 'विकल्प वैल्यू:' निर्दिष्ट करके, आप यह निर्धारित कर रहे हैं कि सूची क्या है, भले ही आपके 'विकल्प:' ऑब्जेक्ट्स की एक सरणी के लिए बाध्यकारी बिंदु, मुझे समझने में थोड़ी देर लग गई। – Shaun

संबंधित मुद्दे