我想将多个变量切换为true或false,具体取决于当前路由,控制器会在页面加载时检查这些路径。
VpcYeoman.SuperTableController = Ember.ArrayController.extend({
routedToLocations: false,
routedToUsers: false,
currentPath: '/',
checkCurrentPath: function() {
if ( currentPath == '/users')
this.set( 'routedToUsers', true )
} elsif ( currentPath == '/locations' ) {
this.set( 'routedToLocations', true )
}
});
superTable.hbs
{{#if routedToUsers}}
Users!
{{/if}}
{{#if routedToLocations}}
Locations
{{/if}}
在users.hbs中
{{render superTable model}} //which will result in the string 'Users!'
{{render superTable model}} //which will result in the string 'Locations!'
或者我可以使用设置值在'users'控制器中添加变量,如routedToUsers
。它看起来像,
- users_controller.js -
routedToUsers: true,
canBeEdited: false,
canBeDeleted: true,
这样,每个超级表都有这些变量,除了它们已经预定义。另一个例子。
- locations_controller.js -
routedToUsers: false, // this is obviously false but for example's sake
routedToLocations: true,
canBeEdited: false,
canBeDeleted: false,
因此,如果我在另一个页面上点击#link-to
,将我路由到“用户”,控制器将使用“checkCurrentPath
”来确保我确实在用户页面上。
答案 0 :(得分:1)
您的应用中确实存在两组主要的路径更改或“transitions
”。
首先: Ember将初始化,路由器将用户转换到所需的上下文。如果您有嵌套资源,这可能需要多次转换。如果用户返回嵌套资源或重新加载页面,则Ember很聪明并将使用上下文重新加载。因此,自动转换。
第二:用户可以根据您制作的任何用户界面进行转换。
要解决两个问题中的第一个问题,您可能需要使用currentPath
挂钩初始化每个路由的控制器以激活setupController
属性。这样在页面加载时路由将执行第一个setter,然后观察者将处理任何基于用户的路径更改。
这是一个可以放在应用程序控制器中的通用路径观察器。 它将解决两个问题中的第二个问题:
App.ApplicationController = Ember.Controller.extend({
needs: ['super-table', 'users', 'locations'],
currentPathDidChange: function () {
var path_base = this.get('currentPath').split('.')[0];
this.set('controllers.super-table.currentPath', path_base); // give your super table template the path
this.nullifyActiveFlags(); // You can write this yourself...
switch(path_base){ // just give me the base resource
case 'users':
this.set('controllers.users.activePath', true);
break;
case 'locations':
this.set('controllers.locations.activePath', true);
break;
}
}.observes('currentPath'),
//...
我可能会将该回调逻辑从观察者中拉出并放入自己的方法中,但这只是伪代码来显示可能的内容。
您还应该将超级表currentPath
setter重构为超级表控制器中的计算别名。
如果需要任何其他说明,请告诉我们!我已经使用了相似的模式很多次,并且在正确配置时效果非常好。
答案 1 :(得分:1)
要直接回答您的问题,undefined
在Javascript中是假的,因此您实际上不需要将其明确设置为false
。如果您希望通用函数将当前路径设置为true
,只需使用正则表达式。例如:
setCurrentPath: function() {
this.set(("routed_to_" + currentPath.match(/\/(.*)/)[1]).camelize(), true);
}
作为一个巨大的警告,我还要补充一点,你可能不应该首先做这些事情。一般来说,如果你发现自己写作
if (isAThing) {
...
} else if (isAnotherThing) {
...
} else if (isYetAnotherThing) {
...
}
您可能会发现command pattern或chain of responsibility pattern有用。
此外,在Handlebars中放置大量逻辑会吞噬你的表现,因为每次发生变化时,它都必须操纵你的DOM。如果您需要逻辑,请将其保存在Javascript中并最小化模板中的计算属性。如果它更复杂,那么让你的路由器决定将什么东西吐出来。
在文本中传达语气真的很难,我希望我不会遇到像是在殴打你。试着传授一些经过深思熟虑的课程。祝你好运。