我正在尝试根据当前用户的组名生成视图。我从自定义列表中收集的组名。
我的问题是如何将收集的组名称应用于“组名”列作为视图参数。
我认为唯一的解决方案:
我创建了一个带参数的视图。
我已将HTML表单Web部件添加到同一页面并将其连接到列表视图(通过Web部件连接将值发送到参数)。然后使用window.onload
函数,我收集当前用户的组名,并通过Form Postback函数传递此值。但由于Postback功能会触发整页重新加载,因此它会进入表单提交的无限循环>页面重新加载。
我尝试过的另一种方法是将一个点击事件监听器附加到BY MY GROUPS选项卡,它运行正常,但唯一的缺点是每次用户点击此选项卡时页面都会重新加载,我想避免这种情况。 / p>
所以我需要的解决方案是在没有页面重新加载的情况下发布表单。
这里建议的另一个选择是使用CSR(客户端渲染),但这有其自身的问题:
此代码无法正常工作。在控制台中,它向我显示正确的项目,但视图似乎无法触及。
因此,似乎CSR只是隐藏了视图中的项目(并且它们仍然可用)。换句话说,它的行为与例如CAML查询不同。
或者我弄错了,我的代码出了问题?
您可以在下面找到我的CSR代码:
<script type='text/javascript'>
(function() {
function listPreRender(renderCtx) {
SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function() {
var currUserID = _spPageContextInfo.userId;
var cx = new SP.ClientContext('/sites/support');
var list = cx.get_web().get_lists().getByTitle('Group Members');
var items = list.getItems(SP.CamlQuery.createAllItemsQuery());
cx.load(items, 'Include(_x006e_x50,DepID)');
cx.executeQueryAsync(
function() {
var i = items.get_count();
while (i--) {
var item = items.getItemAtIndex(i);
var userID = item.get_item('_x006e_x50').get_lookupId();
var group = item.get_item('DepID').get_lookupValue();
if (currUserID === userID) {
var rows = renderCtx.ListData.Row;
var customView = [];
var i = rows.length;
while (i--) {
var show = rows[i]['Group_x0020_Name'] === group;
if (show) {
customView.push(rows[i]);
}
}
renderCtx.ListData.Row = customView;
renderCtx.ListData.LastRow = customView.length;
console.log(JSON.stringify(renderCtx.ListData.Row));
break;
}
}
},
function() {
alert('Something went wrong. Please contact developer')
}
);
});
}
function registerListRenderer() {
var context = {};
context.Templates = {};
context.OnPreRender = listPreRender;
SPClientTemplates.TemplateManager.RegisterTemplateOverrides(context);
}
ExecuteOrDelayUntilScriptLoaded(registerListRenderer, 'clienttemplates.js');
})();
</script>