2015-01-16 25 views
0

我刚学习Backbone JS,下面是Iam不理解如何执行PUT请求的代码。它只会以'POST'的形式发送请求,我如何进行'PUT'操作。请告诉我在代码中需要做什么修改:点击'更新'按钮后,请求不会以'PUT'的方式进行,而是以'POST'的方式进行。

其实iam试图练习这个视频:https://www.youtube.com/watch?v=FZSjvWtUxYk,我只是在'更新'操作。

输出应该是这样的:http://backbonetutorials.com/videos/beginner/#/edit/i4zofel9gi7aq64ggxsu

在上面的链接,“更新”操作效果很好。但对我来说,点击“更新”按钮后,请求不会以'PUT'的方式进行,而应该以'POST'的方式进行。请告诉我出了什么问题。

仅供参考,IAM使用 '服务器' 作为 '的Java代码,即,DAO,RESTful服务'

下面是代码:

<html> 
<head> 
<link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.1.1/css/bootstrap.min.css"> 
<script type="text/javascript"> 
    /*$.getJSON('api/users/1',function(data){ 

     console.log(data); 
    });*/ 
</script> 


</head> 

<body> 

    <div class="container"> 
     <h1>User Manager</h1> 
     <hr/> 
     <div class="page"></div> 
    </div> 

    <script type="text/template" id="user-list-template"> 
     <a href="#/new" class="btn btn-primary">New User</a>  
     <hr> 

     <table class="table stripped"> 
      <thead> 
       <tr> 
        <th>First Name</th> 
        <th>Last Name</th> 
        <th>Age</th> 
       </tr> 
      </thead> 
      <tbody> 
       <% _.each(users,function(user) { %> 
       <tr> 
        <td><%= user.get('firstName') %></td> 
        <td><%= user.get('lastName') %></td> 
        <td><%= user.get('age') %></td> 
        <td><a href="#/edit/<%= user.id %>" class="btn">Edit</a></td> 
       </tr> 
       <% }); %> 
      </tbody> 

     </table> 
    </script> 

    <script type="text/template" id="edit-user-template"> 
     <form class="edit-user-form" > 
      <legend><%= user ? 'Update' : 'Create' %> User</legend> 
      <label>First Name</label> 
      <input type="text" name="firstname" id="firstname" value="<%= user ? user.get('firstName') : '' %>"/> 
      <label>Last Name</label> 
      <input type="text" name="lastname" id="lastname" value="<%= user ? user.get('lastName') : '' %>" /> 
      <label>Age</label> 
      <input type="text" name="age" id="age" value="<%= user ? user.get('age') : '' %>"/> 
      <hr/> 
      <% if(user) { %> 
       <input type="hidden" name="id" value="<%= user.id %>"> 
      <% }; %> 
      <input type="submit" value="<%= user ? 'Update' : 'Create' %> User" /> 
     </form> 
    </script> 

    <script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore-min.js"></script> 
    <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
    <script src="http://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.1.2/backbone-min.js"></script> 

    <script type="text/javascript"> 

     var Users = Backbone.Collection.extend({ 
      url: 'api/users' 
     });  

     var User = Backbone.Model.extend({ 
      urlRoot: 'api/users' 
     }) 

     var UserList = Backbone.View.extend({ 
      el:'.page', 
      render: function(){ 
       var that = this; 
       var users = new Users(); 
       users.fetch({ 
        success: function(usersList){ 
         var template = _.template($('#user-list-template').html())({users: usersList.models});       
         that.$el.html(template); 
        } 
       }); 

      } 
     }); 

     var EditUser = Backbone.View.extend({ 
      el: '.page', 
      render: function(options){ 
       if(options.id){ 
        var that = this; 
        var user = new User({id:options.id}); 
        user.fetch({ 
         success: function(user){ 
          console.log('Updating User...'); 
          var template = _.template($('#edit-user-template').html())({user: user}); 
          that.$el.html(template); 
         } 
        }); 
       } else {  
        console.log('Creating User...'); 
        var template = _.template($('#edit-user-template').html())({user: null}); 
        this.$el.html(template); 
       } 
      }, 
      events:{ 
       'submit .edit-user-form':'saveUser' 
      }, 
      saveUser : function(e){ 
       e.preventDefault(); 
       var user = new User({id: $('#id').val()}); 
       var userDetails = {firstName: $('#firstname').val() ,lastName: $('#lastname').val() ,age: $('#age').val() }; 
       user.save(userDetails, 
        { 
        success : function(user){ 
         console.log('INSIDE SUCCESS..') 
         router.navigate('',{trigger:'true'}); 
        }, 
        type: 'put' 
       }); 
      } 

     }) 

     var Router = Backbone.Router.extend({ 
      routes:{ 
       '':'home', 
       'new': 'editUser', 
       'edit/:id': 'editUser' 
      } 
     }); 


     var userList = new UserList(); 
     var editUser = new EditUser(); 

     var router = new Router(); 
     router.on('route:home',function(){ 
      console.log('we have loaded the home page.'); 
      userList.render(); 
     }); 
     router.on('route:editUser',function(id){ 
      console.log('Show User Form.'); 
      editUser.render({id:id}); 
     }); 

     Backbone.history.start(); 
    </script> 

</body> 

</html> 

回答

1

看起来分配到模型的价值id属性为undefined - 因此Backbone认为您希望创建新模型并发送POST请求。

对于Backbone发送PUT请求,我们不需要明确地传递HTTP方法的名称,我们只需要在调用save()之前指定模型的有效id属性。

我看你正在尝试做的就行了

var user = new User({id: $('#id').val()}); 

saveUser()方法内部。然而有一个在你的模板片段的一个“身份证”的id没有这样的元素。我期望你实际上试图通过name'id'来获取存储在隐藏输入元素中的值吗?

<input type="hidden" name="id" value="<%= user.id %>"> 

但由于你没有得到这个值,你的模型现在拥有的undefinedid属性。

底层骨干Backbone通过在您的模型上调用isNew()来指定相应的HTTP方法。像这样(从backbone source code拍摄)

method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update'); 

您的模型返回true当我们调用isNew(),所以传递给sync()方法的方法参数是“创建”,所以一个POST请求被发送。我们可以做一个快速的测试

var model = new Backbone.Model(); 
model.set({id: undefined}); 
model.isNew(); // returns true 

看到这一点,你可以通过改变你的选择检查这一切是这样的

var user = new User({id: $("input[name='id']").val()}); 

如果这样的作品,我们已经发现了这个问题。然后,我会尝试序列化表单输入,而不是使用jQuery选择器来获取特定值 - 因为这是一种更好的方法。

相关问题