我不清楚如何使用过滤器谓词作为MVC4 SPA HotTowel模板中的参数来导航到新视图的架构。 假设我有一个带有日期(过滤器)下拉列表的主视图和一个导航到Sessions视图的按钮“gotoSessions”。 GoToSessions按钮将导航到Sessions视图,仅显示所选日期的会话。不选择日期将强制会话视图显示所有可用会话。
更新config.js中的“sessions”路由以接受过滤器参数
var routes = [{
url: 'sessions/:filter',
moduleId: 'viewmodels/sessions',
name: 'Sessions',
visible: true,
caption: '<i class="icon-book"></i> Sessions' }, {... the rest of the routes ..}];
实施“gotoSessions”按钮
var selectedDate = ko.observable();
var gotoSessions = function(viewData) {
if (viewData && viewData.selectedDate) {
// build filter to pass to Breeze QueryManager as where clause
var filter = viewData.selectedDate.peek();
// build url with filter parameter
var url = '#/sessions/' + predicate;
router.navigateTo(url);
}
};
在sessions.js viewmodel中,更新activate方法以接受routeData作为参数 并在datacontext.js服务中实现过滤
var activate = function (context) {
var filterParam = context.filter;
// update datacontext getSessionsPartials method to accept filter parameter
return datacontext.getSessionsPartials(sessions, false, filterParam );
};
在services / datacontext.js中更新查询以使用过滤器
var getSpeakersPartials = function (speakersObservable, forceRemote, filter) {
//... code ...
var query = EntityQuery.from('Speakers')
.select('id, firstName, lastName, imageSource')
.where(... filter here ...)
.orderBy(orderBy.speaker);
//... rest of the code...
};
function getLocal(resource, filtering, ordering) {
var query;
if (filtering) {
query = EntityQuery.from(resource)
.where('yourPropertyNameHere', 'equals', filtering)
.orderBy(ordering);
}
else {
query = EntityQuery.from(resource).orderBy(ordering);
}
}
这是MVC4 SPA HotTowel架构的正确实现吗? 你能给出过滤器(谓词)格式化的代码示例吗? 感谢
答案 0 :(得分:1)
似乎是一个奇怪的用户工作流程,让用户选择日期然后转到页面。为什么不首先进入会话页面,然后选择下拉列表?相同的点击次数,使用户更有意义进入会话,然后选择过滤器。页面可能首先出现没有会话(或全部有分页)。然后选择下拉列表并自动应用过滤器。
如果要将参数传递给视图,可以使用hash标记查询字符串中的:parm语法来执行此操作,但我认为重新考虑UX是更好的选择。