2013-11-12 2 views
1

у меня есть модель, как этотПроверить Флажки из массива объектов по нагрузке

function ViewModel(){ 
    var self = this 

    self.Choices   = ko.observableArray([]) 
    self.AcceptedChoices = ko.observableArray([]) 

    self.LoadData = function(){ 
     self.ViewAnswered() 
    } 

    self.ViewAnswered = function(){ 
     var url = 'QuestionsApi/ViewAnswered' 
     var type = 'GET' 
     ajax(url , null , self.OnViewAnsweredComplete, type)     
    } 
    self.OnViewAnsweredComplete = function(data){ 
     var currentAnswer = data.Answer 

     self.Choices(currentAnswer.Choices) 
     self.AcceptedChoices(currentAnswer.AcceptedChoices) 
    }  

    self.LoadData()   
} 

Вот мой объект. Я удалил лишние вещи

{ 
    "AcceptedChoices": [94, 95], 
    "Choices": [{ 
     "ChoiceId": 93, 
     "ChoiceText": "Never" 
    }, { 
     "ChoiceId": 94, 
     "ChoiceText": "Sometimes" 
    }, { 
     "ChoiceId": 95, 
     "ChoiceText": "Always" 
    }] 
} 

И здесь является обязательным

<u data-bind="foreach:Choices"> 
    <li> 
     <input type="checkbox" name="choice[]" data-bind="value:ChoiceId,checked:$root.AcceptedChoices"> 
     <span data-bind="text:ChoiceText">Never</span> 
    </li> 
</u> 

Теперь проблема заключается в том, что Флажки не проверялись из-за выбор, являющийся массив объектов. Как я могу решить эту проблему? Хотя то же самое работает и для радио, где есть только один выбор.

ответ

2

Ничего я нашел решение здесь

checked binding does not properly compare primatives

Также он говорит два пути для этого. Решение, предлагаемое в скрипке, является жутким, поэтому я буду использовать тот, который использует нокаут версии 3.0.0.

Все, что мне нужно сделать, это прикрепить knockout-3.0.0.js вместо любого другого, а затем использовать checkedValue вместо value.

<input type="checkbox" name="choice[]" 
    data-bind=" 
      checkedValue:ChoiceId, 
      checked:$root.AcceptedChoices" 
> 

И все. Надеюсь, это поможет кому-то.

правок:

Я заметил, что это не работает на Chrome. Поэтому я нашел альтернативу. Я создал эти две функции.

self.ConvertToString = function(accepted){ 
    var AcceptedChoices = [] 
    ko.utils.arrayForEach(accepted, function(item) { 
     AcceptedChoices.push(item.toString()) 
    }) 
    return AcceptedChoices 
} 
self.ConvertToInteger = function(accepted){ 
    var AcceptedChoices = [] 
    ko.utils.arrayForEach(accepted, function(item) { 
     AcceptedChoices.push(parseInt(item)) 
    }) 
    return AcceptedChoices   
} 

и использовать их

self.AcceptedChoices(self.ConvertToString(currentAnswer.AcceptedChoices)) 

Чтобы получить значение

AcceptedChoices: self.ConvertToInteger(self.AcceptedChoices()), 
+0

Да, вот почему я закончил это так, как я ответил. Полезно знать, что он наконец исправлен в версии 3.0! –

+0

благодарит Пол за ваши усилия –

+0

слишком плохо. Он не работает в Chrome –

0

Вам нужно проверить, есть ли идентификатор выбора в массиве AcceptedChoices. Используйте функцию ko.utils массива, чтобы помочь сделать это:

checked: function() { return ko.utils.arrayFirst($root.acceptedChoices(), function(item){ 
    return item == ChoiceId(); 
} !== null } 

Вы можете поместить это в функцию на корневой объекте:

self.isChoiceAccepted = function(choiceId){ 
    return ko.utils.arrayFirst($root.acceptedChoices(), function(item){ 
     return item == choiceId; 
    } !== null 
}; 

затем вызвать его в данной привязке как:

checked: function() { return $root.isChoiceAccepted(ChoiceId()); } 

Это не проверено, я не уверен на 100%, что метод arrayFirst возвращает значение null, если он не находит соответствующий элемент в массиве, поэтому попробуйте это.

+0

тоже bad.Its не работает на Chrome –

+0

ли вы получить какие-либо ошибки в консоли? –

+0

no i dont get any –

Смежные вопросы