2014-09-19 3 views
5

У меня проблема с одним элементом select. Я создаю привязку для события change, и он работает, когда я меняю выбранный элемент вручную, но если элемент select привязан к указанному значению, функция изменения не является вызовом.knockoutjs - выберите событие изменения не запускается в первый раз

Мой HTML выглядит так:

<select data-bind="value: myfield, event:{change:myfunction}"> 
    <option value="">Select an element</option> 
    <option value="1">Element 1</option> 
    <option value="2">Element 2</option> 
</select> 

мне это нужно так, что если свойство MyField имеет значение отличное от «» функция изменения будут выполняться.

Если я выбираю элемент, то myfunction - это вызов, и все это нормально, но когда страница загружается, и, например, myfield имеет значение «1», функция не является вызовом, и мне нужно, чтобы эта функция быть казненным, я надеюсь, что вы можете решить мою проблему.

+0

Я пытаюсь понять вашу проблему. Можете ли вы объяснить эту часть своего вопроса, можете ли вы дать некоторые подробности? «но если элемент select привязан к указанному значению» –

+0

Спасибо, друг, посмотрите, если я выберу элемент, который является myfunction, и все это нормально, но когда страница загружается, и, например, myfield имеет значение " 1 "функция не является вызовом, и мне нужно, чтобы эта функция выполнялась, я надеюсь, что вы можете решить мою проблему. –

ответ

20

у вас возникли проблемы, потому что вы боевой Knockout, не используя его здесь :-). Вы должны прочитать the selectedOptions documentation и options binding, или, возможно, даже сделать некоторые из KO tutorials.

В принципе, вы never хотите обработать событие для элементов DOM самостоятельно. Нокаут предназначен именно для этого: обновите ViewModel, когда изменяются входы DOM. Кроме того, Knockout также должен отвечать за генерацию option s для вас.

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

var ViewModel = function() { 
 
    var self = this; 
 
    self.availableOptions = [1, 2]; 
 
    self.myfield = ko.observable(); 
 

 
    self.myfield.subscribe(function(newValue) { 
 
     // Handle a change here, e.g. update something on the server with Ajax. 
 
     alert('myfield changed to ' + newValue); 
 
    }); 
 
} 
 

 
ko.applyBindings(new ViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
<select data-bind="options: availableOptions, 
 
         value: myfield, 
 
         optionsCaption: 'Select an element'"> 
 
</select>

Если вы на самом деле нужно подписаться на изменения в выпадающем меню, подписаться на myfield изменения вместо того, чтобы, как было показано выше.

+1

Я писал то же самое. Я дал вам точку. :) –

+0

Hi Jeroen, вы правы, я не использую ko так хорошо, но теперь я не могу сделать так много изменений, чтобы сделать хорошую привязку (поговорить с PM :)), поэтому по этой причине мне нужно сделать «исправить», может быть, у вас есть идея? –

+0

Самый простой способ исправить это - правильно использовать KO. Любое другое решение будет намного больше работать ИМО. – Jeroen

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