2013-04-26 71 views
1

首先,我是EmberJS世界的新手,试图探索和理解这个框架是什么,我正在使用EmberJS版本1.0.0-rc2EmberJS:从控制器到路由的链接方法

问题描述


我有一个简单的“认证”工作流程,我想通过对呼叫transitionTo从一个状态到另一个状态值以下的情况,而值应该从一个视图得到和也传递到另一个。澄清这里我的情况的工作流的一个简短说明(@login和@Reset是代表性的为相应的路由/控制器/模型/视图组件):

工作流程:

  • @login:用户尝试登录他的凭据(帐户,用户名,密码)
  • @Login:用户登录失败,因为他忘记了他的密码
  • @登录:用户决定重置他的密码并点击链接以进入'重置密码“屏幕与相应的
  • @复位:用户已经在前一个屏幕上填写了'用户名'和'密码'的值,因此在这里提供
  • 用户只需点击按钮即可获取用于密码重置的邮件链接。

所以,正如我的理解,我应该处理这些改变状态的所有东西Route内(从“登录”到“复位”导航)的东西,如登录或复位动作要处理在Controller之内。

现在,我想将@Login Route中的'account'和'password'的值传递给@Reset Route。我无法从RouteController访问View,但是我可以从Route访问Controller,因此我考虑处理Controller中的reset action以获取这两个字段的值并调用方法在Route然后将执行transitionTo方法。这是实现这种行为的正确方法吗?

我给一个小的代码示例,也许这将有助于看到事情更清晰:

代码


的LoginController:

App.LoginController = Ember.ObjectController.extend({ 
account: null, 
username: null, 
password: null, 
submitLogin: function() { 
    $.ajax({ 
    type: 'POST', 
    url: 'authentication/login', 
    data: { 
     account: this.get(account), 
    username: this.get(username), 
    password: this.get(password) 
    }, 
    success: function (data, status) { 
     var dStat = data.status.toString().toLowerCase(); 

     if (dStat == 'ok') { 
     window.location.assign(data.data.redirect); 
     } else if (dStat == 'warning') { 
     console.warn(dStat + data.message); 
     } else if (dStat == 'error') { 
     console.error(dStat + data.message); 
     } 
    }, 
    error: function (xhr, ajaxOptions, thrownError) { 
     console.error('Got an ERROR on Ajax Request!'); 
     console.error('Status (' + xhr.status + ') - Error: ' + thrownError); 
    } 
    }); 
}, 

requestReset: function() { 
    this.get('target').send('reset', { account: this.get('account'), username: this.get(username)}); // <-- this is NOT working 
} 
}); 

LoginRoute:

LoginRoute = Ember.Route.extend({ 
    renderTemplate: function() { 
    this.render('authentication-login', 
    { 
     outlet: 'main' 
    }); 
    }, 

    events: { 
    reset: function (args) { 
     this.transitionTo('authentication.reset', args); // <-- does it work? 
    } 
    } 
}); 

Qu estion


我在正确的道路上通过链接的动作像view --> controller --> route (transitionTo) --> otherRouter --> otherController --> otherView?这样做的“Ember方式”是什么?

更新1:


,如果我试图声明我的两个Controller S之间的依赖关系就像@MikeGrassotti建议

App.LoginRoute = Ember.Route.extend({ 
    renderTemplate: function() { 
    this.render('login', { outlet: 'main' }); 
    }, 

    events: { 
    reset: function() { 
     this.transitionTo('reset'); 
    } 
    } 
}); 

App.LoginController = Ember.ObjectController.extend({ 
    account: null, 
    username: null, 
    password: null, 

    login: function() { 

    } 
}); 


App.ResetRoute = Ember.Route.extend({ 
    renderTemplate: function() { 
    this.render('reset', { outlet: 'main' }); 
    } 
}); 

App.ResetController = Ember.ObjectController.extend({ 
    needs: ['login'], 
    accountBinding: 'controllers.login.account', 
    usernameBinding: 'controllers.login.username' 
}); 

我收到以下错误信息:

Uncaught Error: assertion failed: Cannot delegate set('account', (null)) to the 'content' property of object proxy <App.ResetController:ember198>: its 'content' is undefined 

如果我只是申报的needs财产和相应的模板,我没有得到任何错误调用controllers.login.account,但我也拿不出值(假设我输入“ASDF”的值到登录表单的账号字段)...

回答

3

am I on the right path by chaining the actions like view --> controller --> route (transitionTo) --> otherRouter --> otherController --> otherView ?

是在条款的过渡,但没有尝试传递参数。当从一个路径到另一个需要一个上下文关系中transitionTo('post', somePost)

I want to pass the values for 'account' and 'password' from the @Login Route to the @Reset Route. what is the "Ember Way" of doing this?

而不是传递价值的,你应该通过ARGS在transitionTo的唯一情况是,使用绑定来访问控制器的性能。例如:

App.ResetController = Ember.ObjectController.extend({ 
    needs: ['login'], 
    accountBinding: 'controllers.login.account', 
    usernameBinding: 'controllers.login.username' 
}); 

现在只需使用transitionTo('reset')且没有参数就可以切换到重置路由。

+0

非常感谢您的回答@MikeGrassotti,但是当我尝试像这样看到以下错误:'未捕获的错误:断言失败:无法将集合('account',(null))委托给'content '对象代理的属性:其'内容'是未定义的。 – herom 2013-04-29 05:59:09

+0

这里是我的ResetController代码片段(我希望它在某种通信中可读):App.ResetController = Ember.ObjectController.extend({'login'], accountBinding:'controllers.login。帐户', usernameBinding:'controllers.login.username', requestResetMail:function(){ alert('为用户请求邮件'+ this.get('usernameBinding')+'@'+ this.get(' accountBinding '));} , 取消:函数(){ this.set(' accountBinding”,NULL); this.set( 'usernameBinding',NULL); } });' – herom 2013-04-29 06:00:19

+0

我张贴我的英文更新itial问题有一些更好的代码示例格式和一个更好的解释我的问题;) – herom 2013-04-29 08:49:52