"未捕获的TypeError:[object Object]不是函数"点击

时间:2014-07-25 01:12:30

标签: backbone.js underscore.js

我刚开始学习Backbone.js。在学习模型,收集等时,我正在制作一个在网站上描述的“待办事项”应用程序。代码如下。您可以将其保存为html文件并使用浏览器打开它。您可以通过文本框添加一些任务。现在,当我点击“show pending”或“show completed”时,它给了我在标题中写的错误。请帮助我。谢谢。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title>To do app in Backbone.js</title>


  <style type="text/css">
    #todoapp ul {
      list-style-type: none; /* Hides bullet points from todo list */
    }
    #todo-list input.edit {
      display: none; /* Hides input box*/
    }
    #todo-list .editing label {
      display: none; /* Hides label text when .editing*/
    }    
    #todo-list .editing input.edit {
      display: inline; /* Shows input text box when .editing*/
    }    
  </style>
</head>
<body>
  <!-- ========= -->
  <!-- Your HTML -->
  <!-- ========= -->
  <!-- <div id="container">Loading...</div> -->
  <section id="todoapp">
    <header id="header">
      <h1>Todos</h1>
      <input id="new-todo" placeholder="What needs to be done?">
      <div>
        <a href="#/">show all</a> |
        <a href="#/pending">show pending</a> |
        <a href="#/completed">show completed</a>
      </div> 
    </header>
    <section id="main">
      <ul id="todo-list"></ul>
    </section>
  </section>


  <script type="text/template" id="item-template">
      <div class="view">
        <input class="toggle" type="checkbox" <%= completed ? 'checked' : '' %>>
        <label><%- title %></label>
        <input class="edit" value="<%- title %>">
        <button class="destroy">remove</button>
      </div>
    </script>
  <!-- ========= -->
  <!-- Libraries -->
  <!-- ========= -->
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>
  <script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.5.0/underscore-min.js" type="text/javascript"></script>
  <script src="http://cdnjs.cloudflare.com/ajax/libs/backbone.js/0.9.2/backbone-min.js" type="text/javascript"></script>
  <script src="http://cdnjs.cloudflare.com/ajax/libs/backbone-localstorage.js/1.0/backbone.localStorage-min.js" type="text/javascript"></script>  

  <!-- =============== -->
  <!-- Javascript code -->
  <!-- =============== -->
  <script type="text/javascript">
    // your JS code goes here
    'use strict';
    var app = {}; // create namespace for our app

    app.Todo = Backbone.Model.extend({
      defaults: {
        title: '',
        completed: false
      },
      toggle : function(){
        this.save({completed : !this.get('completed')});
      }
    });

    app.TodoList = Backbone.Collection.extend({
      model: app.Todo,
      localStorage: new Store("backbone-todo"),

      completednew: function() {
        debugger;
        return this.filter(function( todo ) {
          return todo.get('completed'); **//Error in this function after this line**
        });
      },
      remaining: function() {
        return this.without.apply( this, this.completednew() );
      }

    });


    // instance of the Collection
    app.todoList = new app.TodoList();

    app.TodoView = Backbone.View.extend({
      tagName: 'li',
      template: _.template($('#item-template').html()),
      render: function(){
        this.$el.html(this.template(this.model.toJSON()));
        this.input = this.$('.edit');
        return this; // enable chained calls
      },
      initialize:function(){
        this.model.on('change',this.render,this);
        this.model.on('destroy',this.remove,this);
      },
      events:{
        'dblclick label' : 'edit',
        'keypress .edit' : 'updateOnEnter',
        'blur .edit' : 'close',
        'click .destroy' : 'destroy',
        'click .toggle' : 'toggleCompleted'
      },
      edit : function(){
        alert('edit called');
        this.$el.addClass('editing');
        this.input.focus();
      },
      updateOnEnter : function(e){
        if(e.which == 13){
          this.close();
        }
      },
      close : function(){
        var value = this.input.val().trim();
        if(value){
          this.model.save({title : value});

        }
        this.$el.removeClass('editing');
      },
      destroy : function(){

        this.model.destroy();
      },
      toggleCompleted : function(){
        //alert('toggleCompleted');
        this.model.toggle();
      }
    });


   // var view = new app.TodoView({model: todo});


    app.AppView = Backbone.View.extend({
      el: '#todoapp',
      initialize: function () {
        this.input = this.$('#new-todo');
        // when new elements are added to the collection render then with addOne
        app.todoList.on('add', this.addOne, this);
        app.todoList.on('reset', this.addAll, this);
        app.todoList.fetch(); // Loads list from local storage
      },
      events: {
        'keypress #new-todo': 'createTodoOnEnter'
      },
      createTodoOnEnter: function(e){
        if ( e.which !== 13 || !this.input.val().trim() ) { // ENTER_KEY = 13
          return;
        }
        app.todoList.create(this.newAttributes());
        this.input.val(''); // clean input box
      },
      addOne: function(todo){
       // alert('one called');
        var view = new app.TodoView({model: todo});
        $('#todo-list').append(view.render().el);
      },
      addAll: function(){
       // alert('all called');
        this.$('#todo-list').html(''); // clean the todo list
        switch(window.filter){
          case 'completed' : 
              _.each(app.todoList.completednew(),this);
              break;
          case 'pending' : 
              _.each(app.todoList.remaining(),this);
              break;
          default :
              app.todoList.each(this.addOne, this);
              break;
        }

      },
      newAttributes: function(){
        return {
          title: this.input.val().trim(),
          completed: false
        }
      }
    });

    app.Router = Backbone.Router.extend({
      routes:{
        '*filter'  : 'setFilter'
      },
      setFilter : function(param){
        console.log('app.router.param = ' + param);
        window.filter = param.trim() || '';
        app.todoList.trigger('reset');
      }
    });

    //--------------
    // Initializers
    //--------------   
    app.router = new app.Router();
    Backbone.history.start();
    app.appView = new app.AppView();


  </script>

</body>
</html>

0 个答案:

没有答案