2011-11-07 81 views
3

作为一个总是使用Javascript的初学者,我决定尝试从非常简单的开始和更先进的基因敲除。然而,我甚至无法设法在一个非常简单的情况下运作。基因敲除文本绑定对输入不起作用

我猜这个问题很简单,我有点尴尬地问这里。但是我不擅长调试Javascript,也不知道bug如何表现出来。

这是网页的HTML源代码它已经被asp.net MVC 3生成后:

<html> 

<head> 
    <title>Index</title> 
    <link href="/Content/Site.css" rel="stylesheet" type="text/css" /> 
    <script src="/Scripts/jquery-1.5.1.min.js" type="text/javascript"></script> 
</head> 

<body> 

<h2>Index</h2> 

<script src="/Scripts/knockout-1.3.0beta.debug.js" type="text/javascript"></script> 
<script src="/Scripts/knockout-1.3.0beta.js" type="text/javascript"></script> 

<script type="text/javascript"> 

    var viewModel = { 
     name: "Joe", 
     number: "13" 
    }; 

</script> 

<script type="text/javascript"> 
    ko.applyBindings(viewModel); 
</script> 

<ul> 
<li>Name: <input data-bind="text: name"/></li> 
<li>Number: <input data-bind="text: number"/></li> 
</ul> 

<ul> 
<li>Name: <span data-bind="text: name"></span></li> 
<li>Number: <span data-bind="text: number"></span></li> 
</ul> 

</body> 
</html> 

乔或13不会被绑定到输入或文本框。

试图把它放在一个ko.observable(),但也不工作。这就像脚本没有运行。

尝试使用FireBug进行调试,我可以看到applyBinding被执行,并且viewModel对象包含正确的变量。

这可能是明显的事情在这里发生。如果你在这里看不到它,那么你能指出在使用FireBug时应该注意什么吗?


编辑

试图给我仍然有问题的解决方案的几种组合之后。有了一个解决方案的HTML看起来像这样:

<html> 
<head> 

    <title>Index</title> 

    <link href="/Content/Site.css" rel="stylesheet" type="text/css" /> 
    <script src="/Scripts/jquery-1.5.1.min.js" type="text/javascript"></script> 
    <script src="/Scripts/knockout-1.3.0beta.debug.js" type="text/javascript"></script> 
    <script type="text/javascript"> 
      var viewModel = { 
       name: ko.observable("Joe"), 
       number: ko.observable("13") 
      }; 
    </script> 

    <script type="text/javascript"> 
     $(function() { ko.applyBindings(viewModel); }) 
    </script> 

</head> 

<body> 
<h2>Index</h2> 

<ul> 
<li>Name: <input data-bind="text: name"></input></li> 
<li>Number: <input data-bind="text: number"></input></li> 
</ul> 

<ul> 
<li>Name: <span data-bind="text: name"></span></li> 
<li>Number: <span data-bind="text: number"></span></li> 
</ul> 

</body> 
</html> 

似乎没有我使用哪种applyBindings解决方案,他们所有的工作一样。

所以绑定终于可以工作,但只能在IE和Firefox上使用,而不能在Chrome上使用。此外,观察结果完全不起作用。我无法通过写入输入字段来更新字段。

回答

9

输入标签应绑定(即当用户键入到输入框模型得到更新。)以名字作为值而不是文本

Name:<input data-bind="value: name"></input> 
9

applyBindings必须在html完全加载后执行。通常,我从jquery.ready方法中调用它,但是如果你在需要绑定的html标签之后放置包含applyBindings的脚本块,我想它也会起作用。

+0

好吧,知道这很简单。那么惯例是使用这个jquery.ready方法?我想我可以谷歌了解它。 –

+0

$(document).ready(ko.applyBindings(viewModel))应该怎么办?它不工作。 –

+0

$(function(){ko。applyBindings(viewModel);})将可能更好地工作 –

2

尝试:

<script type="text/javascript"> 
$(function() { 


    var viewModel = { 
     name: "Joe", 
     number: "13" 
    }; 

    ko.applyBindings(viewModel); 
}); 
</script> 

..而且使姓名和号码可观察到的,如果你想双向绑定

+0

有了这个解决方案+ ko.observable和Bert提供的解决方案(在关闭html标签下设置applybinding),它可以在firefox和IE中使用,但不适用于Chrome。在IE中,变量出现在输入框和范围内,但在更新输入时不更新。在Firefox中,它不会出现在输入框中,但在查看源代码时应用到标记中。在铬它根本不工作。 –

+0

您可以参考淘汰赛JavaScript文件两次。只参考一次并将参考移动到头标签。 –

0

脚本应写在绑定控件下方:

<div>Today's message is: <span data-bind="text: myMessage"></span></div><script type="text/javascript"> 
var viewModel = { 
    myMessage: "Hello" 
}; 
ko.applyBindings(viewModel);</script>