Tengo este código de eliminación:
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());
Este 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>
El ejemplo es el mismo que el que se encuentra en el sitio web de Knockout, pero cuando lo ejecuto, devuelve este mensaje en Chrome Fire Bug:
Uncaught TypeError: no se puede leer la propiedad 'nodeType' de nulo
Este está relacionado con el archivo knockout y con esta línea de mi script:
ko.applyBindings(new TaskListViewModel());
Y este error apunta a esta línea (1766) en el nocaut:
var isElement = (nodeVerified.nodeType == 1);
¿Qué estoy haciendo mal?
javascript
knockout.js
Gerep
fuente
fuente
Respuestas:
Este problema estaba sucediendo porque estaba tratando de vincular un
HTML
elemento antes de que se creara.Mi secuencia de comandos se cargó en la parte superior
HTML
(en la cabecera), pero necesitaba cargarse en la parte inferior de miHTML
código (justo antes de la etiqueta de cierre del cuerpo).Gracias por tu atención James Allardice .
Una posible solución alternativa es utilizar
defer="defer"
Use esto si el script no va a generar ningún contenido de documento. Esto le dirá al navegador que puede esperar a que se cargue el contenido antes de cargar el script.
Leer más .
Espero eso ayude.
fuente
<script ...>
etiqueta debe estar en la parte inferior de la página, justo antes de la</body>
etiqueta de cierre .Es posible que desee considerar el uso del controlador jquery ready para esto
Entonces logras dos cosas:
Ver http://api.jquery.com/ready/
fuente
$(handler)
es equivalente a$(document).ready(handler)
si tiene jQuery, aplique el enlace dentro
onload
para que el knockout busque el DOM cuando DOM esté listo.fuente
Tiene un simple error de ortografía:
Debiera ser:
fuente