2014-01-29 3 views
1

У меня есть код следующим образом:KNOCKOUT значения не расслоение плотной переплетены

Html:

<select 
    name="data3" 
    size="1" 
    id="data3" 
    data-bind="options: datalist, value: profile().dat.data()[2].Value()"> 
</select> 

JavaScript:

$(function() 
{ 
    clientviewmodel = viewmodel(); 
    ko.applyBindings(clientviewmodel); 
}); 

function viewmodel() 
{ 
    var self = this; 
    self.profile = ko.observable(ko.mapping.fromJS($.parseJSON(datareceived))); 
} 

JSon:

{ "dat": {"data": [{"Value":"1"}, {"Value":"2"}, {"Value":"3"} ] } } 

Моя проблема заключается в том, что значение не привязывается к изменению элемента управления select.

+0

Это правильная строка json, которую вы используете? –

+0

У вас есть какие-либо ошибки в вашей консоли javascript для вашего браузера? – nemesv

+0

@Tim B Джеймс извините, например, {"dat": {"data": [{"Value": "1"}, {"Value": "2"}, {"Value": "3"} ]}} – Dani

ответ

0

Ваш профиль JSON недействителен.

у вас есть

{ 
    "dat"{ 
     "data"[ 
      { 
       "Value": "1" 
      }, 
      { 
       "Value": "2" 
      }, 
      { 
       "Value": "3" 
      } 
     ] 
    } 
} 

должно быть:

{ 
    "dat": { 
     "data": [ 
      { 
       "Value": "1" 
      }, 
      { 
       "Value": "2" 
      }, 
      { 
       "Value": "3" 
      } 
     ] 
    } 
} 

JsonLint.com является полезным инструментом в этих случаях

+0

У меня это как будто, {"dat": {"data": [{"Value": "1"}, {"Значение": "2"}, {"Значение": "3"}]}} значение еще не привязано – Dani

+0

datalist не определен нигде? –

2

У вас есть дополнительный набор () в конце вашего переплета.

Правильное связывание должно выглядеть следующим образом:

<select 
    name="data3" 
    size="1" 
    id="data3" 
    data-bind="options: datalist, value: profile().dat.data()[2].Value"> 
</select> 

Demo JSFiddle.

С письмом Value() вы не привязываетесь к своему наблюдаемому свойству, а к его базовому значению, которое делает вашу привязку в одну сторону.

+0

Я также пробовал, profile(). Dat.data() [2].Значение, это не сработало – Dani

+0

Тогда попробуйте воспроизвести это в jsfiddle, вы можете начать с того, с чем связаны. Потому что, если у вас нет ошибок в консоли, пишите 'profile(). Dat.data() [2] .Value' должен исправить эту проблему. – nemesv

1

Потому что вы написали viewmodel() как «классического» конструктора, но не создать его экземпляр с new, вы на самом деле установка profile как глобальную переменную и ничего не возвращает, когда вы называете его, и, следовательно, на самом деле не применяя привязок на вашу виртуальную машину.

Стандартная практика JavaScript заключается в том, что имена классических конструкторов и только те имена должны начинаться с заглавной буквы, чтобы напомнить вам, что вам нужно создать их с помощью new.

наблюдения Немева и Нила Томпсона также применяются; вы не должны разворачивать value в вашей привязке, а datalist должен быть свойством вашей виртуальной машины.

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