私はこのノックアウトコードを持っています:
function Task(data) {
this.title = ko.observable(data.title);
this.isDone = ko.observable(data.isDone);
}
function TaskListViewModel() {
// Data
var self = this;
self.tasks = ko.observableArray([]);
self.newTaskText = ko.observable();
self.incompleteTasks = ko.computed(function() {
return ko.utils.arrayFilter(self.tasks(), function(task) { return !task.isDone() });
});
// Operations
self.addTask = function() {
self.tasks.Push(new Task({ title: this.newTaskText() }));
self.newTaskText("");
};
self.removeTask = function(task) { self.tasks.remove(task) };
}
ko.applyBindings(new TaskListViewModel());
このhtml:
<head>
<script type="text/javascript" src="jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="knockout-2.0.0.js"></script>
<script type="text/javascript" src="script.js"></script>
</head>
<body>
<h3>Tasks</h3>
<form data-bind="submit: addTask">
Add task: <input data-bind="value: newTaskText" placeholder="What needs to be done?" />
<button type="submit">Add</button>
</form>
<ul data-bind="foreach: tasks, visible: tasks().length > 0">
<li>
<input type="checkbox" data-bind="checked: isDone" />
<input data-bind="value: title, disable: isDone" />
<a href="#" data-bind="click: $parent.removeTask">Delete</a>
</li>
</ul>
You have <b data-bind="text: incompleteTasks().length"> </b> incomplete task(s)
<span data-bind="visible: incompleteTasks().length == 0"> - it's beer time!</span>
</body>
この例はKnockout Webサイトにあるものと同じですが、実行すると、Chrome Fire Bugで次のメッセージが返されます。
不明なTypeError:nullのプロパティ 'nodeType'を読み取れません
これは、ノックアウトファイルとスクリプトの次の行に関連しています。
ko.applyBindings(new TaskListViewModel());
そして、このエラーはノックアウト時に次の行(1766)を指しています:
var isElement = (nodeVerified.nodeType == 1);
私は何を間違えていますか?
この問題は、作成前にHTML
要素をバインドしようとしたために発生していました。
私のスクリプトはHTML
(頭の中)の上にロードされましたが、HTML
コードの最後(body終了タグの直前)にロードする必要がありました。
ご清聴ありがとうございました James Allardice 。
可能な回避策は、defer="defer"
を使用することです
<script src="script.js" type="text/javascript" defer="defer"></script>
スクリプトがドキュメントコンテンツを生成しない場合に使用します。これは、スクリプトをロードする前にコンテンツがロードされるのを待つことができることをブラウザに伝えます。
さらに読む 。
それが役に立てば幸い。
このためにjquery readyハンドラーを使用することを検討してください。
$(function() {
function TaskListViewModel() {
...
ko.applyBindings(new TaskListViewModel());
});
次に、2つのことを達成します。
http://api.jquery.com/ready/ を参照してください
jQueryにonload
内に適用バインディングを置くと、DOMの準備ができたときにノックアウトがDOMを探すようになります。
$(document).ready(function(){
ko.applyBindings(new TaskListViewModel());
});
単純なスペルミスがあります:
self.addTask = fuction() {
する必要があります:
self.addTask = function() { //Notice the added 'n' in 'function'