2015-06-30 36 views
0

我有一个KnockoutJS和可见的绑定快速(希望简单)的问题。我似乎无法让它为下面的代码工作。所有它应该做的是显示一个表单,而“signedIn”是假的,一旦表单被提交,表单应该消失,并且应该显示“你已经以(用户名)登录”。如何正确使用KnockoutJS可见绑定?

<form class="pad-bottom" data-bind="visible: !signedIn, submit: signIn"  onsubmit="signIn()"> 
    <div class="form-group"> 
     <label for="username">Sign In</label> 
     <input class="form-control" type="text" name="username" id="username" placeholder="Enter your userame" /> 
    </div> 
    <button type="submit" class="btn btn-primary">Sign In</button> 
    <br /> 
</form> 

<div data-bind="visible: signedIn"> 
    <p>You are signed in as <strong data-bind="text: username"></strong></p> 

var vm = { 
    username: ko.observable(), 
    signedIn: ko.observable(false), 

    signIn: function() { 
     vm.username($('#username').val()); 
     vm.signedIn(true); 
    } 
} 

目前我没有看到绑定似乎工作,因为它总是显示形式和总是显示“您的登录身份为”文本。我觉得我失去了一些明显的东西,但我希望一组新鲜的眼睛可以帮助我找到它。如果有任何帮助,我正在使用Visual Studio 2013。

+0

'可见:signedIn'总是返回'FALSE'因为'signedIn'是可观察到的功能。你最好用'visible:!signedIn()'去。另外,'submit'绑定处理程序和本地'onSubmit'都不需要。 – haim770

回答

2

如果您直接绑定到诸如data-bind="visible: signedIn等可观察对象,则可以使用()来敲除可观察函数,而不必调用可观察函数。但是,只要你在绑定的observable上做了一些事情,例如否定它,或者如果你使用了一个相等性检查,那么在取消它或比较它之前,你需要调用observable函数来读取它的值。

因此,在你的代码,你需要调用观察到的功能如下:

data-bind="visible: !signedIn() 

鉴于此,我认为它总是调用函数观察到避免出错,如这个最佳实践。

而不是使用jQuery来获得用户名的价值使用敲除value绑定来做到这一点。

由于您使用的是Knockout submit绑定,因此无需使用onsubmit

<form class="pad-bottom" data-bind="visible: !signedIn(), submit: signIn"> 
    <div class="form-group"> 
     <label for="username">Sign In</label> 
     <input data-bind="value: username" class="form-control" type="text" name="username" id="username" placeholder="Enter your userame" /> 
    </div> 
    <button type="submit" class="btn btn-primary">Sign In</button> 
    <br /> 
</form> 
var vm = { 
    username: ko.observable(), 
    signedIn: ko.observable(false), 

    signIn: function() { 
     vm.signedIn(true); 
    } 
}; 

JsFiddle

+0

感谢您的解决方案,这完美的作品。我有点困惑,我想到了signedIn vs signedIn()。考虑到有必要使用!signedIn()来显示表单,为什么我们只使用signedIn来显示“您已登录”div? – Minnal

+0

所以当你只使用observable的值时,不需要使用函数'()'。只要你使用这个值去做别的事情,你需要使用函数'()'。这就是为什么你可以使用'data-bind =“signedIn”'或'data-bind =“signedIn()”'但不能使用'data-bind =“!signedIn”',而必须使用'data-bind = “!signedIn()”'。 –