0

我正在尝试创建一个非常简单的东西 - 登录。

这是我的模板:

        <script type="text/x-handlebars" data-template-name="login">
        <div class="row well">
            <form class="form-inline">
                {{input value=email type="text" placeholder="Email?"}}
                {{input value=password type="password" placeholder="Password?"}}

                {{#view App.LoginView}}
                    <button id="login-button" type="submit" class="btn">Sign in</button>
                {{/view}}
            </form>

            {{#if not_logged}}
                <div class="alert alert-error">
                  <button type="button" class="close" data-dismiss="alert">&times;</button>
                  <strong>Warning!</strong> Best check yo self, you're not looking too good.
                </div>
            {{/if}}
        </div>
    </script>

风景:

App.LoginView = Ember.View.extend(
{
    tagName: "span",

    click: function()
    {
        this.$("#login-button").button("loading");
        this.get("controller").send("do_login");
    }
});

控制器:

App.LoginController = Ember.Controller.extend(
{
    is_logged: true,

    do_login: function()
    {
        /** some ajax comes here **/
    }
});

因此,用户单击按钮,我将其状态更改为“正在加载”。问题是如果登录失败,我如何向视图发出信号,以便我可以这样做。$("#login-button").button("reset"); ?

4

2 回答 2

2

这样的事情应该这样做:

App.LoginController = Ember.Controller.extend({
  is_logged: true,
  loginFailed: false,

  do_login: function() {
    /** some ajax comes here **/
    // if the login failed set the boolean
    // this triggers the property binding 
    // which in turn executes your "reset" function in the view
    this.set('loginFailed', true);
  }
});

App.LoginView = Ember.View.extend({
  tagName: "span",

  click: function() {
    this.$("#login-button").button("loading");
    this.get("controller").send("do_login");
  },

  reset: function() {
    if(this.get("controller.loginFailed")){
      this.$("#login-button").button("reset");
    }
  }.observes('controller.loginFailed')
});

希望能帮助到你。

于 2013-08-06T18:54:09.527 回答
1

我已经完成了将 boostrap 按钮包装在所有者组件中并使用绑定的操作。我认为这是 ember 方式,而不是使用 jquery 来查找按钮。

控制器:

App.LoginController = Ember.ObjectController.extend({
    not_logged: false,
    email: 'foo@bar.com',
    password: 'ember',
    isLoading: false,
    doLogin: function() {
        this.set('isLoading', true);
        // simulates some ajax
        Ember.run.later(this, function() {
            if (this.get('email') == 'foo@bar.com' && this.get('password') == 'ember') {
                this.set('not_logged', false);
                // transition to other route etc
            } else {
                this.set('not_logged', true);
            }
            this.set('isLoading', false);
        }, 1000);
    }
});

自定义按钮组件:

App.BoostrapButton = Ember.View.extend({ 
    tagName: 'button',
    attributeBinding: ['type'],
    type: 'submit',
    classNames: ['btn'],
    isLoading: true,
    isLoadingChanged: function() {        
        debugger;
        if (this.get('isLoading')) {            
            this.$().button('loading');
        } else {
            this.$().button('reset');
        }
    }.observes('isLoading')    
})

这个jsfiddle

看看这个jsfiddle

这里的奖励是embercasts的一集,展示了如何进行登录。

于 2013-08-06T19:40:37.060 回答