2013-05-31 5 views
3

У меня есть флажок и текстовое поле. Я хочу, чтобы текстовое поле было пустым и не редактировалось, когда флажок не выбран.привязка привязки для флажка не работает должным образом в нокаут

Часть, где я должен отключить текстовое поле, когда текстовое поле не выбрано, отлично работает, но очистка части не работает нормально, потому что я должен использовать привязку привязки к нему, и как только я использую привязку кликов, он отключает флажок поведение, и оно становится непривлекательным. У меня есть jsFiddle для него: http://jsfiddle.net/qK5Y3/16/

и образец кода ниже:

<input type="checkbox" id="emailTemplateSendAtTime" name="emailTemplateSendAtTime" data-bind="checked:SendAtTime, click:ClickSendAtTime"/> 
<input type="text" style="width: 250px" id="emailTemplateSendAtTimeProperty" data-bind="value: SendAtTimeProperty, enable:SendAtTime"/> 

Это мой ЯШ:

var ViewModel = function() { 

    this.SendAtTimeProperty = ko.observable("Something"); 
    this.SendAtTime = ko.observable(); 



    this.ClickSendAtTime = function() { 
       if (model.SendAtTime() == false) { 
        model.SendAtTimeProperty(""); 
       } 
      }; 
}; 
ko.applyBindings(new ViewModel()); 

Любые предложения?

ответ

8

две вещи:

  • добавить model в качестве параметра для ClickSendAtTime
  • возвращение истинного на ClickSendAtTime, чтобы избежать отмены события

    var ViewModel = function() { 
    
        this.SendAtTimeProperty = ko.observable("Something"); 
        this.SendAtTime = ko.observable(); 
    
        this.ClickSendAtTime = function (model) { 
          if (model.SendAtTime() == false) { 
           model.SendAtTimeProperty(""); 
          } 
          return true; 
         }; 
    }; 
    
    ko.applyBindings(new ViewModel()); 
    

Другой способ определить ClickSendAtTime

this.ClickSendAtTime = function() { 
     if (this.SendAtTime() == false) { 
      this.SendAtTimeProperty(""); 
     } 
     return true; 
}; 

Некоторые сведения о том, почему вам нужно вернуть истинный

Разрешение по умолчанию действие

По умолчанию Нокаут предотвратит событие от действий любого по умолчанию. Например, если вы используете привязку события для захвата события нажатия клавиши входного тега, браузер будет вызывать только функцию вашего обработчика и не будет добавлять значение ключа к значению входного элемента. Более распространенным примером является использование привязки кликов, которое внутренне использует это связывание, где будет вызываться функция вашего обработчика, но браузер не будет переходить на href ссылки. Это полезно по умолчанию, потому что, когда вы используете привязку кликов, это обычно происходит потому, что вы используете ссылку как часть пользовательского интерфейса, который управляет вашей моделью просмотра, а не как регулярная гиперссылка на другую веб-страницу.

Однако, если вы хотите, чтобы действие по умолчанию продолжалось, просто верните true из функции обработчика событий.

http://knockoutjs.com/documentation/event-binding.html

+0

Большое вам спасибо за ваш ответ. Это сработало.Хотя я не совсем понимаю, почему я должен вернуться, чтобы избежать отмены мероприятия? Не могли бы вы объяснить мне более подробно? или направить меня к статье, которая обсуждает это более подробно? – TeaLeave

+1

@Californicated: добавлена ​​запрашиваемая информация –

+0

спасибо вам большое. – TeaLeave

2

Внутри вашей ViewModel переменная model не определена, так что вы должны удалить его и вместо того, чтобы использовать this и внутри Флажок Нажмите event возвращает истину, так что работа событие как обычно (если вы не сделали вернуть что-либо или false, событие будет таким, как если бы оно было отменено)

var ViewModel = function() { 
    self = this; 
    self.SendAtTimeProperty = ko.observable("Something"); 
    self.SendAtTime = ko.observable(); 
    this.ClickSendAtTime = function() { 
     if (self.SendAtTime() == false) { 
      self.SendAtTimeProperty(""); 
     } 
     return true; 
    }; 
}; 
ko.applyBindings(new ViewModel()); 
+0

Вы правы. Но я не помню, чтобы возвращать true в любом из привязок событий при использовании нокаута. Что в этом особенного? – TeaLeave

+0

здесь вы используете событие click..for например, если вы хотите остановить это событие, вы просто ** возвращаете false; **, попробуйте использовать событие проверки, и вы увидите, что вам ничего не нужно возвращать –

+0

для Например, одна и та же модель просмотра имеет функцию добавления, которая привязана к кнопке «Добавить» с привязкой кликов, а следующий код работает отлично: model.Add = function() { var data = { ID: "", Название: "", FromAddress: "", Тема: "", Тело: "", CampaignId: model.CampaignId(), DefaultToAddress: "", SendAtTimeProperty: "", SendAtTime: ложные }; модель.LoadEditBox (данные); } ;. – TeaLeave

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