Backbone model.save()覆盖以前的模型

时间:2015-11-11 09:12:00

标签: javascript backbone.js

我保存模型时遇到问题。而不是用新的cdi创建一个新的模型我总是得到相同的CD1,似乎我的模型只是覆盖了以前的。

以下是我的简单注册表单:

HTML

<form class="form-signin">
      <h2 class="form-signin-heading">Please sign in</h2>
      <label for="inputName" class="sr-only">Name</label>
      <input type="text" id="inputName" class="form-control" placeholder="Name" required autofocus>
      <label for="inputSurname" class="sr-only">Surname</label>
      <input type="text" id="inputSurname" class="form-control" placeholder="Surname" required autofocus>
      <label for="inputNickname" class="sr-only">Nickname</label>
      <input type="text" id="inputNickname" class="form-control" placeholder="Nickname" required autofocus>
      <label for="inputEmail" class="sr-only">Email address</label>
      <input type="email" id="inputEmail" class="form-control" placeholder="Email address" required autofocus>
      <label for="inputPassword" class="sr-only">Password</label>
      <input type="password" id="inputPassword" class="form-control" placeholder="Password" required>
      <div class="checkbox">
        <label>
          <input type="checkbox" value="remember-me"> Remember me
        </label>
      </div>
      <span id="btn-submit" class="btn btn-lg btn-primary btn-block" type="submit"> Sign in </span>
    </form>

型号:

var User = Backbone.Model.extend({
defaults: {
    inputName: "",
    inputSurname: "",
    inputNickname: "",
    inputEmail: "",
    inputPassword: "",
    rememberMe: false
},
url: 'src/users.json'

});

查看:

var SignupView = Backbone.View.extend({

events: {
    'keypress input': 'getInputs',
    'click #btn-submit': 'saveInputs'
},

initialize: function() {
    // Make sure functions are called in the right scope
    _.bindAll(this, 'saveInputs');

    // Listen to model changes
    // this.model.bind('change', this.edit)
},

getUser: function(cid) {
    return this.model
},

saveInputs: function(evt) {
    evt.preventDefault();

    var model = this.model;

    this.$el.find('input[id]').each(function() {
        model.set( this.id, this.value );
    });
    this.model.save();
    console.log(model);

    this.$el.find('input').each(function() {
        this.value = ""
    });
}

});

收集:

   var Searchers = Backbone.Collection.extend({
    model: User
});

我的app.js

 var SignUp = Backbone.View.extend({
    el: '.container'
});

var userModel = new User();
var searchersCollection = new Searchers();
searchersCollection.bind('change', function(rec){
    console.log('A record was changed:' + rec);
});


var signupView = new SignupView({
    el: $(".form-signin"),
    model: userModel
});

var signup = new SignUp();

因此,如果用户在表单中键入他的数据,然后在Web控制台中输入:

  

的usermodel

     

child {cid:“c1”,attributes:Object,_changing:false,_previousAttributes:Object,changed:Object ...}

但如果新用户键入新数据并再次检查Web控制台:

  

的usermodel

     

child {cid:“c1”,attributes:Object,_changing:false,_previousAttributes:Object,changed:Object ...}

我有相同的cid,我的userModel中只有一个模型,属性是最后引入的。 我需要的是保存我的所有用户,而不是过度使用它们,并且能够访问它们。我想我的模型?

我无法理解我错在哪里:/

2 个答案:

答案 0 :(得分:0)

cid表示ClientID,在创建模型对象时分配。 你应该使用&#34; idAttribute&#34;定义远程id字段。

答案 1 :(得分:0)

根据我的理解,你需要的是一个集合,而不是一个模型。

模型代表单个实体,如书籍或用户。 模型的save方法用于将其数据与持久层同步,并使用从中返回的数据进行更新

集合是模型的集合。如果您希望每次用户保存表单时都使用不同cid的新模型,则应add将其添加到集合中,骨干网将初始化集合中指定的模型的新实例{{1} 1}}属性并将其添加到集合中。

由于您有一组用户实体,因此您应该将集合指向model,而不是模型。

users.json

而不是单个模型,您应该传递该类型模型的集合:

var Searchers = Backbone.Collection.extend({
    url: 'src/users.json',
    model: User
});

在save方法中,将应作为新模型添加的数据传递给集合var signupView = new SignupView({ el: $(".form-signin"), collection: searchersCollection }); 方法:

add

另请注意,您需要调用saveInputs: function(evt) { evt.preventDefault(); this.collection.add({ name: "", age: "" }); } 方法,以便从端点填充集合。

我建议您阅读文档和教程,因为您似乎仍需要了解基础知识。