3

我将此 Ember Rails 应用程序https://github.com/kagemusha/ember-rails-devise-demo从 coffeescript 转换为 javascript。当我单击链接时,AuthController 中的登录和注册操作可以正常工作,但是,当我单击注销按钮时,我收到一个错误,即没有处理注销事件,即使有一个操作设置可以在相同的情况下执行此操作控制器作为其他两个链接。

Uncaught Error: Nothing handled the event 'logout'. 

        {{view App.MenuItem href="#/login" label="Login" }}
        {{view App.MenuItem href="#/registration" label="Register"}}
         <button class="btn" {{action logout}}>Logout</button>

你能明白为什么 AuthController 中的注销操作可能没有处理该事件吗?它适用于咖啡脚本版本。

更新,有一个 App.NavbarController 扩展 ObjectController 并将注销包装在操作哈希中。

导航栏控制器

  App.NavbarController = Ember.ObjectController.extend({
    needs: ['auth'],
    isAuthenticated: Em.computed.alias("controllers.auth.isAuthenticated"),
    actions: {
      logout: function() {   
        return this.get("controllers.auth").logout();
      }
    }
  });

认证控制器

App.AuthController = Ember.ObjectController.extend({
    currentUser: null,
    isAuthenticated: Em.computed.notEmpty("currentUser.email"),
    login: function(route) {
      var me;
      me = this;
      return $.ajax({
        url: App.urls.login,
        type: "POST",
        data: {
          "user[email]": route.currentModel.email,
          "user[password]": route.currentModel.password
        },
        success: function(data) {
          log.log("Login Msg " + data.user.dummy_msg);
          me.set('currentUser', data.user);
          return route.transitionTo('home');
        },
        error: function(jqXHR, textStatus, errorThrown) {
          if (jqXHR.status === 401) {
            return route.controllerFor('login').set("errorMsg", "That email/password combo didn't work.  Please try again");
          } else if (jqXHR.status === 406) {
            return route.controllerFor('login').set("errorMsg", "Request not acceptable (406):  make sure Devise responds to JSON.");
          } else {
            return p("Login Error: " + jqXHR.status + " | " + errorThrown);
          }
        }
      });
    },
    register: function(route) {
      var me;
      me = this;
      return $.ajax({
        // url: App.urls.register,
        url: "/users.json",
        type: "POST",
        data: {
          "user[name]": route.currentModel.name,
          "user[email]": route.currentModel.email,
          "user[password]": route.currentModel.password,
          "user[password_confirmation]": route.currentModel.password_confirmation
        },
        success: function(data) {
          me.set('currentUser', data.user);
          return route.transitionTo('home');
        },
        error: function(jqXHR, textStatus, errorThrown) {
          return route.controllerFor('registration').set("errorMsg", "That email/password combo didn't work.  Please try again");
        }
      });
    },
    logout: function() {
      var me;
      console.log("Logging out...");
      me = this;
      return $.ajax({
        url: App.urls.logout,
        type: "DELETE",
        dataType: "json",
        success: function(data, textStatus, jqXHR) {
          $('meta[name="csrf-token"]').attr('content', data['csrf-token']);
          $('meta[name="csrf-param"]').attr('content', data['csrf-param']);
          log.info("Logged out on server");
          me.set('currentUser', null);
          return me.transitionToRoute("home");
        },
        error: function(jqXHR, textStatus, errorThrown) {
          return alert("Error logging out: " + errorThrown);
        }
      });
    }
  });
4

2 回答 2

3

你能展示更多你的模板和视图吗?在原始代码中,应用程序模板使用渲染标签来渲染 NavBar,这会渲染 NavBar 模板并启动 NavBar 控制器。您可能希望将带有控制台日志的 init 函数放入控制器中,以确保正确创建它:

init: function(){
    this._super();
    console.log('navbar controller starting...');
}

我注意到您发布的模板代码不包含 {{#if isAuthenticated}} 部分 - 是否正常工作?

于 2013-09-24T03:59:59.140 回答
0

动作需要包装在一个actions对象中。查看文档以获取更多详细信息。

于 2013-09-13T19:26:58.523 回答