2013-05-06 13 views
0

Я столкнулся с глубокими проблемами с нокаутом при работе в IE9 с режимом совместимости с IE8. Вот проблема:Проблема с нокаутом IE8

У меня есть массив динамически сгенерированных текстовых полей, и событие изменения связано с этими элементами. Когда событие изменения есть, в режиме совместимости IE8 мне нужно дважды нажать вкладку, чтобы отойти от элемента управления. Этого не происходит в Firefox, ни когда нет привязки к событию.

Я не уверен, является ли это проблема с моим событием, так что я отправляю код здесь:

<tbody data-bind="foreach: DailyItemList"> 
          <tr> 
           <td> 
           <span data-bind="text:Day"></span> 

           </td> 
           <td><input id="Text2" data-bind="value: Required"/></td> 
           <td><input id="Text3" data-bind="value: Setup, event:{change: ValidateSetup}"/></td> 
           <td><input id="Text4" data-bind="value: Close, event:{change: ValidateClose}"/></td> 
    </tr> 
    </tbody> 

Вот вид модели с функциями изменения:

var DailyItem = function (data) { 
this.Day = ko.observable(data.DayOfWeek); 
this.Required = ko.observable(data.Required); 
this.Setup = ko.observable(data.SetupTime); 
this.Close = ko.observable(data.CloseTime); 
this.ValidateSetup = function() { 
    if (this.Setup() > 30) { 
     alert('Invalid SetupTime'); 
    } 
} 
this.ValidateClose = function() { 
    if (this.Close() > 30) { 
     alert('Invalid SetupTime'); 
    } 
} 
} 

function ViewModel(items) { 
    this.DailyItemList = ko.observableArray([]); 
    records = $.map(items, function (data) { return new DailyItem(data) }); 
    this.DailyItemList(records); 
} 
+0

не делают событие изменения. make ValidateSetup вычисляет доступ к значению ввода. удалите событие: {измените, и вы хорошо пойдете. –

+0

HI, спасибо за ваш ответ, но мне нужно сделать несколько вещей внутри функции - то, что я показал, является лишь примером. Мне нужно обновить несколько других наблюдаемых внутри функции. – devC

+0

Вы все еще можете сделать это внутри вычисленного. Но если вы не хотите вычисленных, подпишитесь на лежащие в основе наблюдаемые и сделайте то, что вам нужно сделать. –

ответ

2

Если вы хотите работать с совместимостью IE8, тогда вы можете вернуть true из ваших Validate функций.

this.ValidateSetup = function() { 
    if (this.Setup() > 30) { 
     alert('Invalid SetupTime'); 
    } 

    return true; 
} 

Вот пример: http://jsfiddle.net/rniemeyer/FfNqv/ (jsFiddle имеет некоторые проблемы самостоятельно в режиме IE8, так что вы можете запустить http://jsfiddle.net/rniemeyer/FfNqv/show/)

Лучший подход, хотя, вероятно, будет использовать manual subscription. Это хороший вариант для выполнения кода всякий раз, когда происходит одно наблюдаемое изменение. То же самое можно сделать и в computed, что позволяет вам зависеть от множества наблюдаемых.

С ручной подписки вы могли бы сделать:

<input id="Text3" data-bind="value: Setup"/> 

В вашей модели представления, вы бы что-то вроде:

this.Close = ko.observable(data.CloseTime); 
this.Close.subscribe(function(newValue) { 
    if (newValue > 30) { 
     alert('Invalid SetupTime'); 
    } 

    //set other observables, or do whatever you like. "this" will be the this object. 

}, this); 
+0

спасибо, я получил эту работу с оператором return. Как вы сказали, ручные подписки могут быть лучшим вариантом, но я не хотел идти с ним прямо сейчас, потому что есть много кода для изменения. Это большая страница. Спасибо за помощь снова :) – devC

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