Javascript 如何正确使用KnockoutJS可见绑定?

Javascript 如何正确使用KnockoutJS可见绑定?,javascript,jquery,html,knockout.js,data-binding,Javascript,Jquery,Html,Knockout.js,Data Binding,我有一个关于KnockoutJS和可见绑定的快速(希望很简单)问题。我只是不能让它为下面的代码工作。它所要做的就是在“signedIn”为false时显示一个表单,一旦表单提交,表单就会消失,并显示“You is signed as(username)” 目前,我的所有可见绑定似乎都不起作用,因为它总是显示表单,并且总是显示“You is signed as”文本。我觉得我错过了一些显而易见的东西,但我希望一双新鲜的眼睛能帮我找到它。如果有帮助的话,我使用的是Visual Studio 2013

我有一个关于KnockoutJS和可见绑定的快速(希望很简单)问题。我只是不能让它为下面的代码工作。它所要做的就是在“signedIn”为false时显示一个表单,一旦表单提交,表单就会消失,并显示“You is signed as(username)”


目前,我的所有可见绑定似乎都不起作用,因为它总是显示表单,并且总是显示“You is signed as”文本。我觉得我错过了一些显而易见的东西,但我希望一双新鲜的眼睛能帮我找到它。如果有帮助的话,我使用的是Visual Studio 2013。

对于敲除的可观察对象,如果直接绑定到可观察对象(如
数据绑定),则不必使用
()
调用可观察函数=“可见:签名在
。但是,一旦您在绑定中对可观察到的对象执行了一些操作,比如否定它,或者如果您使用了相等检查,那么您就需要调用可观察到的函数,在否定它或比较它之前先读取值

因此,在您的代码中,您需要调用可观察函数,如下所示:

data-bind="visible: !signedIn()
有鉴于此,我认为最好的做法是总是调用可观察函数来避免这样的错误

不要使用jquery来获取username的值,而是使用Knockout绑定来实现这一点

由于您使用的是敲除绑定,因此无需使用
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>

可见:!signedIn
将始终返回
false
,因为
signedIn
是一个可观察的函数。您最好使用
visible:!signedIn()
。此外,无需同时使用
submit
绑定处理程序和本机
onSubmit
。感谢您提供的解决方案,这一点非常有效。我对signedIn vs signedIn()有点困惑。考虑到这是必要的,我们使用!signedIn()用于显示表单,为什么我们只使用signedIn来显示“You is signed in”div?因此,当您仅使用可观察值时,不必使用函数
()
。一旦使用该值对该值执行其他操作,就需要使用函数
()
。这就是为什么您可以使用
data bind=“signedIn”
data bind=“signedIn()”
但不能使用
data bind=“!signedIn”
,而必须使用
data bind=“!signedIn()”
data-bind="visible: !signedIn()
<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);
    }
};