【问题标题】:Delay of updating with if meteor/blaze statements使用 if meteor/blaze 语句延迟更新
【发布时间】:2019-10-25 00:31:32
【问题描述】:

我创建了一个带有自定义登录的迷你应用程序,始终在同一页面中,为了更好地解释我有一个带有登录和注册的主页,当我进行登录/注册时,我仍然在同一页面上,登录表单在哪里出现“欢迎回来”面板。 问题是,当我尝试使用 F5 重新加载页面时,我得到了大约 2 秒钟的旧登录表单,然后出现“欢迎回来”面板。如我们所见,我使用 Blaze 的 If 语句来管理当前用户登录的检查:

<template name="login">
    {{#if currentUser}}
    <div class=" card mb-4 shadow-sm">
        <div class="card-header">
          <h4 class="my-0 font-weight-normal">Welcome Back</h4>
        </div>
        <div class="card-body">
            TEST
        </div>
      </div>
      {{else}}
        <div id="panel-login" class=" card mb-4 shadow-sm">
                <div class="card-header">
                  <h4 class="my-0 font-weight-normal">Login Form</h4>
                </div>
                <div class="card-body">
                    <form class="login-form">
                        <div class="form-group">
                            <label for="InputEmail">Email address</label>
                            <input type="email" class="form-control" name="email" id="InputEmailLogin" aria-describedby="emailHelp" placeholder="Enter email">
                            <small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small>
                        </div>
                        <div class="form-group">
                            <label for="InputPassword">Password</label>
                            <input type="password" name="password" class="form-control" id="InputPasswordLogin" placeholder="Password">
                        </div>
                        <button type="submit" class="btn btn-primary">Login</button>
                        <span>or <a href="#" class="register-link">Create an account</a></span>
                    </form>
                </div>
              </div>

              <div id="panel-register" class=" card mb-4 shadow-sm">
                    <div class="card-header">
                      <h4 class="my-0 font-weight-normal">Register Form</h4>
                    </div>
                    <div class="card-body">
                        <form class="register-form">
                            <div class="form-group">
                                <label for="InputEmail">Email address</label>
                                <input type="email" class="form-control" name="email" id="InputEmail" aria-describedby="emailHelp" placeholder="Enter email">
                                <small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small>
                            </div>
                            <div class="form-group">
                                <label for="InputPassword">Password</label>
                                <input type="password" name="password" class="form-control" id="InputPassword" placeholder="Password">
                            </div>
                            <div class="form-group">
                                <label for="InputPassword">Repeat Password</label>
                                <input type="password" name="password2" class="form-control" id="InputPasswordConfirm" placeholder="Repeat Password">
                            </div>
                            <button type="submit" class="btn btn-primary">Register</button>
                            <span>or <a href="#" class="login-link">Login</a></span>
                        </form>
                    </div>
                  </div>
        {{/if}}
</template>

这是我管理登录/注册系统整个事件的 JS 文件:

Template.login.events({
    'click .register-link': function() {
        $('#panel-login').hide();
        $('#panel-register').show().addClass("animated fadeIn");
    },
    'click .login-link': function() {
        $('#panel-register').hide();
        $('#panel-login').show().addClass("animated fadeIn");
    },
    // Registration
    'submit .register-form': function(event) {
        var email = trimInput(event.target.email.value);
        var password = trimInput(event.target.password.value);
        var password2 = trimInput(event.target.password2.value);

        if(isNotEmpty(email) && isNotEmpty(password) && isNotEmpty(password2)
            && isEmail(email) && areValidPasswords(password,password2)) {

            Accounts.createUser({
                email: email,
                password: password,
                profile: {
                    userType: 'Normal'
                }
            }, function(err) {
                if(err) {
                    sAlert.error("There was an error with the registration, try again!");
                } else {
                    sAlert.success("Account Created! You are now logged in");
                }
            });
        }

        // Prevent Submit
        return false;

    },
    // Login
    'submit .login-form': function(event) {
        var email = event.target.email.value;
        var password = event.target.password.value;

        Meteor.loginWithPassword(email, password, function(err) {
            if(err) {
                event.target.email.value = email;
                event.target.password.value = password;
                sAlert.error("There is an error with your login, try again!");
            } else {
                sAlert.success("You are now logged in!");

            }
        })

        // Prevent Submit
        return false;
    }

});

Template.login.helpers({
    ifLogged: function(user) {
        if(user != null) {
            $('#panel-login').hide();
        }
    }
});

// Trim the input
var trimInput = function(val) {
    return val.replace(/^\s*|\s*$/g, "");
};

// Check for empty fields
isNotEmpty = function(value) {
    if(value && value !== "") {
        return true;
    }
    sAlert.error('Please fill all the fields');
    return false;
};

// Validating Email
isEmail = function(value) {
    var filter = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    if(filter.test(value)) {
        return true;
    }
    sAlert.error("Invalid email, please use a valid email address");
    return false;
};

// Check passwords fields
isValidPassword = function(password) {
    if(password.length < 6) {
        sAlert.error("Password must be at least 6 characters");
        return false;
    }
    return true;
}

// Check confirmation password
areValidPasswords = function(password, confirm) {
    if(!isValidPassword(password)) {
        return false;
    }
    if(password !== confirm) {
        sAlert.error("Password do not match");
        return false;
    }
    return true;
};

这里有一个 GIF 来显示问题: https://i.gyazo.com/120efc183793d4d1adc5fb518e01c09c.mp4

如果有人可以帮助我,谢谢。

【问题讨论】:

    标签: javascript meteor meteor-blaze


    【解决方案1】:

    如果你只是想摆脱那个电影,那么你可以在Meteor.loggingIn 上实现加载,如下面的示例,用你的用例改变它,即将它包装在一个模板帮助器中,然后用currentUser替换那个帮助器

    if (Meteor.loggingIn()) {
          return 'loading';
        } else if (Meteor.user()) {
          return 'home';
        } else {
          return 'signin';
        }
    

    【讨论】:

      猜你喜欢
      • 2015-02-14
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 2015-05-09
      相关资源
      最近更新 更多