Коллекция магистралей Knockback.js добавляет в интерфейс только первый элемент

Я пытаюсь создать что-то новое с помощью Knockback.js, и сейчас я сталкиваюсь с проблемой интеграции с нокаутом и отбрасыванием. Проблема в том, что я успешно написал обработчик событий, который добавляет новую модель в коллекцию Objectives, но пользовательский интерфейс только регистрирует и добавляет первое такое дополнение. Он успешно добавляет новую цель в список, но только первую - после этого, в то время как коллекция успешно добавляет новую модель в список, она не отображается в пользовательском интерфейсе.

<a class="btn" id="click">Click me!</a>
<div id="objectives" data-bind="foreach: objectives">
    <h3 data-bind="text: name"></h3>
</div>

И этот скрипт:

// Knockback script MUST be located at bottom of the page
$(document).ready(new function() {
// instantiate the router and start listening for URL changes
var page_router = new PageRouter();
Backbone.history.start();

// Get JSON value
var objectives;
$.getJSON('json.php', {table: 'objectives'}).done(function(data) {
    objectives = new ObjectiveCollection(data);
    var view_model = {
        objectives: kb.collectionObservable(objectives, {view_model: kb.ViewModel})
    };
    ko.applyBindings(view_model, $('#objectives').get(0));
});
$('#click').click(function() {
    var objective_model = new Objective({category: 3, name: Math.random(), descriptor: 'What up'});
    objectives.add(objective_model);
    console.log(objectives);
});
});

Где только пользовательские модели, как видно здесь:

/**
 *  Objectives model
 */
var Objective = Backbone.Model.extend({
// Defaults
defaults: {
    id: null,
    category: null,
    weight: null,
    name: null,
    descriptor: null
},
// Url to pass to
url : function() {
    // Important! It's got to know where to send its REST calls. 
    // In this case, POST to '/donuts' and PUT to '/donuts/:id'
    return this.id ? '/objectives/' + this.id : '/objectives'; 
}

});
/**
 *  Basic objectives collection
 */
var ObjectiveCollection = Backbone.Collection.extend({
    model: Objective,
initialize: function(models,options) {}
});

1 ответ

Решение

Оказывается, проблема была расположена здесь:

var Objective = Backbone.Model.extend({
  // Defaults
  defaults: {
    id: null,
    category: null,
    weight: null,
    name: null,
    descriptor: null
}

Он продолжал генерировать модели с нулевым идентификатором, и программа будет отображать только объекты с уникальным идентификатором. Поскольку идентификатор по умолчанию равен нулю, он будет считать два объекта без определенных идентификаторов одинаковыми. Стирая идентификатор: ноль; линия, эта проблема перестала быть проблемой.

Другие вопросы по тегам