У меня есть следующее сканирование. Ребенок объект Definationсо связыванием не работает со значениями по умолчанию
function SearchFilterOption(data){
var self = this
self.FilterCheck = ko.observable(false)
self.List = ko.observableArray([])
self.SelectedOptions = ko.observableArray([])
self.FilterText = ko.computed(function(){
var selectedDescriptions = [];
ko.utils.arrayForEach(self.List(), function (item) {
if (in_array(item.Value, self.SelectedOptions()))
selectedDescriptions.push(item.Description)
})
return selectedDescriptions.join(',')
})
self.FilterLabel = ko.computed(function(){
return (self.SelectedOptions() && self.SelectedOptions().length > 0) ? 'selected_filter' : ''
})
self.FilterClass = ko.computed(function(){
self.List(data)
return (self.FilterCheck() == true) ? 'set_check':'un_check'
})
self.Toggle = function(){
self.FilterCheck(!self.FilterCheck())
}
}
Родитель модель
var page = function() {
var self = this
self.LookupData = ko.observableArray()
self.Countries = ko.observableArray([])
self.LoadData = function(){
self.GetProfileData()
self.GetPreviousSearch()
}
self.GetProfileData = function(){
var url = 'ProfileApi/Index'
var type = 'GET'
var data = null
ajax(url , data , self.OnGetProfileDataComplete , type)
}
self.OnGetProfileDataComplete = function(data){
self.LookupData(getLookupData())
self.Countries(new SearchFilterOption(self.LookupData().Countries))
}
self.GetPreviousSearch = function(){
var url = 'SearchApi/PreviousSearch'
var type = 'GET'
var data = null
ajax(url , data , self.OnGetPreviousSearchComplete , type)
}
self.OnGetPreviousSearchComplete = function(data){
var search = data.Payload
if(search.locationCountryList){self.Countries().SelectedOptions(self.MakeInt(search.locationCountryList))}
}
self.MakeInt = function(array){
return array.map(function(item) {
return parseInt(item, 10);
})
}
self.LoadData()
}
И связывание
$('document').ready(function() {
ko.applyBindings(new page())
})
<div data-bind="with:Countries">
<ul class="srh_fltr">
<li>
<label class="" data-bind="css:FilterLabel">Countries</label>
<p data-bind="text:FilterText"></p>
<div class="check_box">
<a class="un_check active" data-bind="css:FilterClass,click:Toggle">
<img src="../images/spacer.gif">
</a>
</div>
</li>
</ul>
<section class="form_view" data-bind="visible:FilterCheck">
<select multiple="multiple" data-bind="
options:List,
optionsText:"Description",
optionsValue:"Value",
optionsCaption:"--- ",
value:0,
selectedOptions:SelectedOptions"></select>
</section>
</div>
Ниже приведен пример поиска данных
[{
"Value": 1,
"Description": "United States"
}, {
"Value": 2,
"Description": "Canada"
}, {
"Value": 3,
"Description": "United Kingdom"
}, {
"Value": 4,
"Description": "Pakistan"
}, {
"Value": 5,
"Description": "India"
}, {
"Value": 6,
"Description": "Saudi Arabia"
}, {
"Value": 7,
"Description": "U.A.E."
}, {
"Value": 8,
"Description": "Afghanistan"
}, {
"Value": 9,
"Description": "Albania"
}]
OK. Код завершен. Проблема в том, что при вызове GetPreviousSearch
и self.Countries().SelectedOptions()
ничего не выбрано. Я имею в виду, FilterText
не отображается. я видел в консоли объект содержит данные, заполненные GetPreviousSearch
, но ui не изменяется? Как я могу решить эту проблему. Я подозреваю, что with
, возможно, придется что-то с этим сделать.
Here является скрипкой.
Можно ли поставить скрипку здесь? – DevelopmentIsMyPassion
@AshReva см. Скрипку [здесь] (http://jsfiddle.net/raheelshan/afCD4/23/) –
у вашей скрипки есть ошибка. Что такое «in_array»? Является ли эта функция? – DevelopmentIsMyPassion