Ember.js:具有显式目标的操作失败
我想我遗漏了一些非常基本的东西,但以下操作失败,因为App.AppController上不存在“login”操作 模板:Ember.js:具有显式目标的操作失败,ember.js,action,target,mixins,Ember.js,Action,Target,Mixins,我想我遗漏了一些非常基本的东西,但以下操作失败,因为App.AppController上不存在“login”操作 模板: <h2>Click the button and watch the console</h2> <button type="button" {{action login target="App.AppController"}}>Log in</button> JSBin:(这是指向Ember的最新版本,但它与1.0-rc2的行
<h2>Click the button and watch the console</h2>
<button type="button" {{action login target="App.AppController"}}>Log in</button>
JSBin:(这是指向Ember的最新版本,但它与1.0-rc2的行为相同,我已经使用了几天的版本;我还没有在以前的版本上尝试过它)
调试时,控制器mixin似乎没有公开它应该公开的所有函数——login()是我添加的函数,而send()是一个Ember函数。它还缺少其他函数,如get()
我看到在我的应用程序中,login()函数存在于对象app.AppController.prototype上,而在JSBin中,它存在于mixin链中的一个对象上
在这一点上,我甚至乐意处理视图中的登录操作,或者路由器(在过去似乎是默认的),但这些似乎都不起作用
从文档中可以看出,操作处理程序的当前默认位置应该是控制器,然后是路由,但是如果我删除目标并将login()添加到路由中,则会出现另一个错误:没有处理事件“login”
(我首先使用的是目标,因为在我的应用程序中/登录是一个单独的路由,并且具有不同的控制器)
非常感谢您提供解决方案和解决方案!您的目标是类App.AppController,而不是该类的实际实例。如果您正在使用路由器并且处于应用程序视图中,则默认情况下,操作将以AppController为目标 我已经更新了JSbin以调用IndexController上的登录,因为您的示例位于索引路由中:
您还过度使用了send方法,该方法阻止调用login。我不久前在IRC中得到了答案。您说得对了一半,我的目标是定义/单例,而不是实例,但问题是如何定位不同的控制器(为了示例,jsbin被简化),该问题的答案是使用{{action login target=“controllers.app”}。最终的解决方案还要求操作上下文中的控制器具有需求:['app'],以便该操作可以由AppController处理。
App.AppController = Ember.Controller.extend({
login: function() {
// never gets here
debugger;
},
send: function() {
// or even here
debugger;
}
});