Создайте новую строку в базе данных, используя пример canjs

Я пытаюсь расширить этот пример canjs http://jsfiddle.net/xKc3H/367/ (это приложение по умолчанию).
Я хочу добавить новую строку. Я сделал кнопку, чтобы открыть редактор, но когда я пытаюсь его сохранить, я получаю «неопределенное не является функцией» в «Todo.save ()».

 <div id="content">
</div>
<script id='appMustache' type='text/mustache'>
<todos-app>
    <button can-click="select">Add todo</button>  
  <h2>Todays to-dos</h2>
  {{#selectedTodo}}
  <div id='editor'>
    <input type='text' can-value='description' can-change="saveTodo"/>
  </div>
  {{/selectedTodo}}
  <ul>
    {{#each todos}}
    <li>
      <input type='checkbox' can-value='complete'>
      <span class="description {{#if complete}}done{{/if}}" can-click='select'>{{description}}</span>
      <button can-click="destroy"></button>
    </li>
    {{/each}}
  </ul>
    </todos-app>
</script>

Я добавил метод "создать" в свой model.extend, но я не зашел так далеко...

// Here's where we get, save, and delete to-dos.
// (Yep, this is all we need to access the Todo
// REST endpoints!)
var Todo = can.Model.extend({
    findAll: 'GET /todos',
    findOne: 'GET /todos/{id}',
    update: 'PUT /todos/{id}',
    **create: 'PUT /todos/{id}'**,
    destroy: 'DELETE /todos/{id}'
}, {});

// For this example, we're not actually going out to
// a REST endpoint, so we'll use fixtures to emulate that.
// Fixtures help you test your application when you
// don't have access to your REST services.
var TODOS = [
    'Download CanJS',
    'Read the guides',
    'Build your app',
    'Become immortal',
    'Haircut @ 2pm'
];

var todoStore = can.fixture.make(TODOS.length, function(i) {
    return {
        id: i + 1,
        description: TODOS[i],
        done: false
    };
});

can.fixture({
    'GET /todos': todoStore.findAll,
    'GET /todos/{id}': todoStore.findOne,
    'PUT /todos/{id}': todoStore.update,
    **'PUT /todos/{id}': todoStore.create,**
    'DELETE /todos/{id}': todoStore.destroy
});

// Let's drag this out a bit.
can.fixture.delay = 500;

can.Component.extend({
  tag: "todos-app",
  scope: {
    selectedTodo: null,
    todos: new Todo.List({}),
    select: function(todo){
      this.attr('selectedTodo', todo);
    },
    saveTodo: function(todo) {
      console.log('in saveTodo')
      todo.save();
      this.removeAttr('selectedTodo');
    }
  }
})

// Start the application by rendering our template!
$("#content").html(can.view("appMustache", { }))

person Gerald Magnuson    schedule 01.04.2015    source источник
comment
Как выглядит Тодо? Если это экземпляр, он должен быть в нижнем регистре todo. В JavaScript принято использовать только заглавные буквы в именах функций-конструкторов.   -  person Justin Meyer    schedule 01.04.2015
comment
Вы правы, Джастин, я написал их с большой буквы, чтобы увидеть, если Todo == todo... Я исправил фрагмент кода.   -  person Gerald Magnuson    schedule 01.04.2015
comment
Не могли бы вы обновить исходную скрипку, чтобы показать ошибку?   -  person Justin Meyer    schedule 02.04.2015
comment
Я вижу ошибку, когда запускаю на своем локальном компьютере (локальный веб-сервер), а не через jsfiddle... jsfiddle просто останавливается на операторе todo.save()...   -  person Gerald Magnuson    schedule 02.04.2015


Ответы (1)


Я думаю, это то, что вы ищете: http://jsfiddle.net/xKc3H/635/

Проблема заключается в вызове "выбрать" здесь:

<button can-click="select">Add todo</button>  

Когда вызывается select, он не будет вызываться с новым экземпляром Todo в качестве первого аргумента. Он будет вызываться с областью действия todos-app. Итак, я изменил его, чтобы вызвать метод createTodo, который выглядит так:

createTodo: function(){
  var todo = new Todo();
  this.attr('selectedTodo', todo );  
  this.attr('todos').unshift(todo);
}

Это создает новый экземпляр Todo, помечает его как выбранный и добавляет в список задач.

Другая версия этого может проверить в saveTodo, находится ли selectedTodo в todos, если нет, переместить selectedTodo в todos.

person Justin Meyer    schedule 01.04.2015