Eu tenho este código nocaute:
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>
O exemplo é o mesmo encontrado no site Knockout, mas quando eu o executo, ele retorna esta mensagem no Chrome Fire Bug:
TypeError não capturado: não é possível ler a propriedade 'nodeType' de nulo
Este está relacionado ao arquivo knockout e a esta linha do meu script:
ko.applyBindings(new TaskListViewModel());
E este erro está apontando para esta linha (1766) no nocaute:
var isElement = (nodeVerified.nodeType == 1);
O que estou fazendo de errado?
javascript
knockout.js
Gerep
fonte
fonte
Respostas:
Este problema estava acontecendo porque eu estava tentando vincular um
HTML
elemento antes de ser criado.Meu script foi carregado na parte superior
HTML
(no cabeçalho), mas precisava ser carregado na parte inferior do meuHTML
código (antes da tag de fechamento do corpo).Obrigado pela sua atenção James Allardice .
Uma possível solução é usar
defer="defer"
Use isso se o script não for gerar nenhum conteúdo de documento. Isso dirá ao navegador que ele pode esperar o conteúdo ser carregado antes de carregar o script.
Leitura adicional .
Espero que ajude.
fonte
<script ...>
tag precisa estar na parte inferior da página, logo antes da</body>
tag de fechamento .Você pode querer considerar o uso do manipulador pronto jquery para isso
Então você consegue duas coisas:
Veja http://api.jquery.com/ready/
fonte
$(handler)
é equivalente a$(document).ready(handler)
se você tiver jQuery, coloque apply binding dentro de
onload
modo que o knockout procure pelo DOM quando o DOM estiver pronto.fonte
Você cometeu um erro de grafia simples:
Deveria estar:
fonte