Ich habe diesen Knockout-Code:
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());
Dieses 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>
Das Beispiel ist das gleiche wie auf der Knockout-Website, aber wenn ich es ausführe, wird diese Meldung in Chrome Fire Bug zurückgegeben:
Nicht erfasster TypeError: Die Eigenschaft 'nodeType' von null kann nicht gelesen werden
Dieser bezieht sich auf die Knockout-Datei und auf diese Zeile meines Skripts:
ko.applyBindings(new TaskListViewModel());
Und dieser Fehler zeigt auf diese Zeile (1766) beim Knockout:
var isElement = (nodeVerified.nodeType == 1);
Was mache ich falsch?
javascript
knockout.js
Gerep
quelle
quelle
Antworten:
Dieses Problem trat auf, weil ich versuchte, ein
HTML
Element zu binden , bevor es erstellt wurde.Mein Skript wurde oben auf
HTML
(im Kopf) geladen, aber es musste unten in meinemHTML
Code geladen werden (kurz vor dem schließenden Body-Tag).Vielen Dank für Ihre Aufmerksamkeit James Allardice .
Eine mögliche Problemumgehung ist die Verwendung
defer="defer"
Verwenden Sie diese Option, wenn das Skript keinen Dokumentinhalt generiert. Dadurch wird dem Browser mitgeteilt, dass er warten kann, bis der Inhalt geladen ist, bevor das Skript geladen wird.
Weiterführende Literatur .
Ich hoffe es hilft.
quelle
<script ...>
Tag muss sich kurz vor dem Schließen des</body>
Tags am Ende der Seite befinden .Möglicherweise möchten Sie hierfür den jquery ready-Handler verwenden
Dann erreichen Sie zwei Dinge:
Siehe http://api.jquery.com/ready/
quelle
$(handler)
ist gleichbedeutend mit$(document).ready(handler)
Wenn Sie jQuery eingefügt haben, wenden Sie eine Bindung an,
onload
damit Knockout nach dem DOM sucht, wenn das DOM bereit ist.quelle
Sie haben einen einfachen Rechtschreibfehler:
Sollte sein:
quelle