2013-05-31 55 views
3

我有一个复选框和文本框。我希望textbox在没有选中复选框时为空且不可编辑。单击绑定复选框无法正常工作在敲除

当文本框未被选中时,我必须禁用文本框的部分工作正常,但清空部分无法正常工作,因为我必须使用复选框的点击绑定,只要我使用点击绑定,它会打破复选框行为,它变得不可点击。我有这方面的的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"/> 

这是我的JS:

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返回true,以避免取消事件

    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; 
}; 

为什么你需要返回true

允许的默认操作

默认情况下的一些信息,淘汰赛将阻止事件采取任何默认操作。例如,如果您使用事件绑定来捕获输入标签的按键事件,那么浏览器将只调用您的处理函数,并且不会将该键的值添加到输入元素的值。一个更常见的例子是使用点击绑定,它在内部使用此绑定,您的处理函数将被调用,但浏览器不会导航到链接的href。这是一个有用的默认设置,因为当您使用点击绑定时,通常是因为您将链接用作操纵视图模型的UI的一部分,而不是作为常规超链接指向另一个网页。

但是,如果您确实想让默认操作继续,只需从您的事件处理函数返回true即可。

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

+0

非常感谢您的回答。这工作。虽然我不清楚为什么我应该回归真实以避免取消事件?你能稍微详细解释一下吗?或者直接给我一篇更详细的讨论这篇文章的文章? – TeaLeave

+1

@Californicated:添加要求的信息 –

+0

非常感谢你。 – TeaLeave

2

里面你ViewModel变量model没有定义,所以你应该将其删除,而使用this和复选框内单击event返回true,该事件工作正常(如果你没有返回任何或错误的事件将被视为已被取消)

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

这里你使用的是单击事件..例如,如果你想停止该事件,你只需**返回false; **,尝试使用检查事件,你会发现你不需要返回任何东西 –

+0

例如,相同的视图模型具有添加功能,该功能通过点击绑定绑定到添加按钮,并且以下代码工作正常:model.Add = function(){ var data = { ID:“”, 名称:“”, FROMADDRESS: “”, 主题: “”, 身体: “”, CAMPAIGNID:model.CampaignId(), DefaultToAddress: “”, SendAtTimeProperty: “”, SendAtTime:假 }; model.LoadEditBox(data); } ;. – TeaLeave