Ember.js ';行动';在Ember中不调用控制器方法
我将这个Ember Rails应用程序从coffeescript转换为javascript。当我单击链接时,AuthController中的登录和注册操作可以完美地工作,但是,当我单击注销按钮时,我得到一个错误,即任何操作都无法处理注销事件,即使在与其他两个链接相同的控制器中有一个操作设置Ember.js ';行动';在Ember中不调用控制器方法,ember.js,Ember.js,我将这个Ember Rails应用程序从coffeescript转换为javascript。当我单击链接时,AuthController中的登录和注册操作可以完美地工作,但是,当我单击注销按钮时,我得到一个错误,即任何操作都无法处理注销事件,即使在与其他两个链接相同的控制器中有一个操作设置 Uncaught Error: Nothing handled the event 'logout'. {{view App.MenuItem href="#/login" label="
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>
身份验证控制器
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);
}
});
}
});
操作需要包装在
操作
对象中。查看以了解更多详细信息。能否显示更多模板和视图?在原始代码中,应用程序模板使用渲染标记渲染导航栏,这将渲染导航栏模板并启动导航栏控制器。您可能希望在控制器中加入一个带有控制台日志的init函数,以确保其创建正确:
init: function(){
this._super();
console.log('navbar controller starting...');
}
我注意到您发布的模板代码没有包含{{{#if isAuthenticated}}部分-这是否正常工作 实际上,如果您看到更新的代码,它将被包装在actions对象中。你知道为什么它可能仍然不能工作吗?你能尝试使用
{{action logout target=“controller”}
。我认为,在当前版本的Ember中,必须始终显式地指定它们。除非目标是视图,否则没有必要指定目标。动作助手的默认行为是调用相应控制器的动作。模板中的手柄标记为“NavbarView”,对吗?您确定问题在于控制器没有处理注销动作吗?也可能是它正在处理它并返回true
,导致操作冒泡,然后引发您看到的错误。仅用您提供的代码片段调试很困难。
init: function(){
this._super();
console.log('navbar controller starting...');
}