将输入值与骨干收集数据进行比较

时间:2014-08-11 15:54:11

标签: javascript backbone.js

我尝试使用backbonejs创建非常简单的登录。集合存储用户名和密码。登录视图有两个输入,点击它应执行检查功能,并将输入值与集合中的数据进行比较。

Html部分如下所示:

<div class="login-block">
  <script type="text/template" id="start">
    <form id="login">
      <div class="input-wrapper"><input type="text" placeholder="Username" id="username" required></div>
      <div class="input-wrapper"><input type="password" placeholder="Password" id="password" required></div>
      <div class="input-wrapper"><button class="btn">Sign in!</button></div>
    </form>
  </script>

  <div class="error" class="block">
       Error
  </div>

  <div class="success">
      Success
  </div>
</div>

这是我的Js代码:

var User = Backbone.Model.extend({
    defaults: {
      login: 'root',
      mail: 'root@mail.com',
      password: ''
    }
});

var user = new User();

//variable to store username

var loginData = {
    username: "",
    password: ""
}

// userbase
var UserCollection = Backbone.Collection.extend({
    model: User
});



var userCollection = new UserCollection([
  {
   username: 'Ivan',
   mail: 'ivan@mail.com',
   password: '1234'
  },
  {
   username: 'test',
   mail: 'test@mail.com',
   password: 'test'
  }
 ]);

// login page

var LoginView = Backbone.View.extend({
    el: $(".login-block"),

    events: {
      "click .btn": "check"
    },

    check: function(){
      loginData.username = this.$el.find("#username").val(); // store username
      loginData.password = this.$el.find("#password").val();// store password
          if (loginData.username === userCollection.each.get("username") && loginData.password === userCollection.each.get("password")) 
              {appRouter.navigate("success", {trigger: true});
          }else{
              appRouter.navigate("error", {trigger: true});
              } 
      },

      render: function () {
        //$(this.el).html(this.template());
          var template = _.template($('#start').html())
          $(this.el).html(template());
          //template: template('start');
          return this;
      }
}); 

var loginView = new LoginView({collection: userCollection});

var AppRouter = Backbone.Router.extend({
    routes: {
       '': 'index', // start page
       '/error': 'error',
       '/success': 'success'
    },

    index: function() {
         loginView.render();
         console.log("index loaded");
    }, 

    error: function(){
      alert ('error');
    },

    success: function(){

      console.log('success');
    }


});

var appRouter = new AppRouter();

Backbone.history.start();

它对检查功能工作正常,它存储用户名和密码,但是在开始比较时路由器或检查功能明显错误。它不是路由到成功或错误页面,而是重新呈现索引页面。

P.S我没有使用命名空间,一般来说代码质量不高,但它仅用于教育目的。

2 个答案:

答案 0 :(得分:4)

您必须将属性type="button"添加到按钮,否则它会在点击时提交表单(请参阅this question):

<script type="text/template" id="start">
  <form id="login">
    <div class="input-wrapper"><input type="text" placeholder="Username" id="username" required></div>
    <div class="input-wrapper"><input type="password" placeholder="Password" id="password" required></div>
    <div class="input-wrapper"><button class="btn" type="button">Sign in!</button></div>
  </form>
</script>

您还可以在单​​击事件处理程序中返回false,这将取消默认操作。 (如果您不添加type="button",则提交表单。)

为了将这些值与硬编码集合进行比较,您无法调用each,因为您将收到错误,因为您正在执行此操作(这是由Underscore提供的iteration function)。您可以使用Underscore的findWhere方法,该方法也可在Backbone集合中使用。因此,单击事件处理程序(您的check函数)可能如下所示:

check: function(){
    loginData.username = this.$el.find("#username").val(); // store username
    loginData.password = this.$el.find("#password").val();// store password            
    if(userCollection.findWhere({username: loginData.username, password: loginData.password})){
        appRouter.navigate("success", {trigger: true});
    }else{
        appRouter.navigate("error", {trigger: true});
    } 
    return false;
},

您可以在this fiddle

上试用

答案 1 :(得分:0)

你正在做的逻辑检查看起来不像对我有用。我希望以下内容生成错误:

userCollection.each.get('username')

您在集合上调用的函数,每个函数都是一个包装的下划线方法,它将函数回调作为参数。如果你想检查你的用户名和密码,我会做这样的事情:

var user = userCollection.findWhere({ username: loginData.userName });

这将返回用户名匹配的模型。然后,您可以检查该模型的密码:

if (user.get('password') === loginData.password) {
  // do something
} else {
  // do something else 
}

编辑哎呀,你可以一次做两次检查:

var user = userCollection.findWhere({ username: loginData.userName, password: loginData.password });

我将保留以前的代码以进行演示。