2014-02-10 3 views
0

Мой ViewModel являетсяКак IE и Chrome выполняют knockoutjs иначе, чем Firefox?

var emailModel = function (email, isPreferred) { 
    this.Email = ko.observable(email); 
    this.IsPreferred = ko.observable(isPreferred); 
}; 

var vm = function() { 
    var self = this; 
    self.emails = ko.observableArray([new emailModel('', false)]); 
    self.addEmail = function() { 
     self.emails.push(new emailModel('', false)); 
    }; 
    self.removeEmail = function (email) { 
     self.emails.remove(email); 
    }; 
    self.setPreferred = function (email) { 
     if (email.IsPreferred()) { 
      for (var i = 0; i < self.emails().length; i++) { 
       if (self.emails()[i] != email) 
        self.emails()[i].IsPreferred(false); 
      } 
     } 
    }; 
} 

setPreferred работы, как ожидается, в Firefox, но не в IE, ни Chrome. Может ли кто-нибудь пролить свет?

скрипка здесь

http://jsfiddle.net/xpluni/3t5HH/

+0

Ваш скрипку, кажется, работает нормально. – Pointy

+0

@ По умолчанию setPreferred не работает, как переключатели. – xpluni

+1

@Jamiec Я не могу убедить своего клиента в этом ... – xpluni

ответ

0

Благодаря ответам и комм Я понял это.

В setPreferred

self.setPreferred = function (email) { 
    if (email.IsPreferred()) { 
     for (var i = 0; i < self.emails().length; i++) { 
      if (self.emails()[i] != email) 
       self.emails()[i].IsPreferred(false); 
     } 
    } 
}; 

В основном Firefox занимает обновленное значение email.IsPreferred в то время как IE/Chrome занимает старое значение.

Решение получает обновленное значение от элемента, а не нокаутом, наблюдаемым.

self.setPreferred = function (email, target) { 
    if (target.target.checked) { 
     for (var i = 0; i < self.emails().length; i++) { 
      if (self.emails()[i] != email) 
       self.emails()[i].IsPreferred(false); 
     } 
    } 
}; 

http://jsfiddle.net/xpluni/3t5HH/1/

0

Разница между браузерами является порядком, по которому обновляются привязки. Простое добавление 1 отладки линии будет показывать это вверх:

self.setPreferred = function (email) { 
    console.log(email.IsPreferred()) <-- here 
    if(email.IsPreferred()){ 
     .... 

Это будет войти в консоль true в Firefox при установке флажка. Однако в IE он регистрирует false как (я подозреваю), что привязка еще не обновлена.

Таким образом, в целом,

  • Firefox - связывает checked связывания затем выполняет click
  • IE - выполняет click, а затем связывает checked свойство

Изменено скрипку, чтобы дать его http://jsfiddle.net/3t5HH/2/

+0

Спасибо.Я исправил свою скрипку. http://jsfiddle.net/xpluni/3t5HH/1/ – xpluni

+0

Разве это не следует считать ошибкой Knockout? – Pointy

+0

@Pointy - Возможно. Это, безусловно, непоследовательно. – Jamiec

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