在sap.m.Select
上使用数据聚合时,始终会选择第一个条目。这是SDK's preview的链接。
我的应用中的示例代码
new sap.m.Select("id-names", {
width: '100%',
}).bindAggregation("items", "data>/trip/names", new sap.ui.core.Item({
text: "{data>Name}"
}));
构造函数上有一个名为selectedKey
的参数,用于将其更改为另一个索引。我想要的是选择空白,因为我想强迫我的用户做出选择,而不是温和地接受列表中的第一个条目。
我可以强制在我的聚合data>/trip/names
中输入一个空白条目,但这会污染我的列表。
有没有更好的方法来实现这一目标?
答案 0 :(得分:10)
自OpenUI5版本1.34起,您可以将false
属性设置为forceSelection
。
true
属性指示选择是否仅限于列表中的某个项目。默认值为false
(这意味着,如果未设置选择,则会选择下拉列表中的第一项)。
何时将其设为#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <netdb.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#define SERVERPORT 8888
#define MAXBUF 1024
int main(int argc, char* argv[])
{
int socket1, socket2;
int addrlen;
struct sockaddr_in fServer, fClient;
int status;
socket1=socket(AF_INET, SOCK_STREAM, 0);
if(socket1==-1)
{
printf("Could not create the socket\n");
exit(1);
}
fServer.sin_family=AF_INET;
fServer.sin_addr.s_addr=INADDR_ANY;
fServer.sin_port= htons(SERVERPORT);
status=bind(socket1, (struct sockaddr*) &fServer,
sizeof(fServer));
if(status==-1)
{
printf("could not bind the socket\n");
exit(1);
}
else printf("socket is created\n");
status=listen(socket1, 5);
if(status==-1)
{
printf("could not listen socket\n");
exit(1);
}
else printf("socket is waiting for connection\n");
for(;;)
{
int fd;
int i, readCounter, writeCounter;
char* bufptr;
char buf[MAXBUF];
char filename[MAXBUF];
addrlen=sizeof(fClient);
socket2=accept(socket1, (struct sockaddr*) &fClient, &addrlen);
if(socket2==-1)
{
printf("could not accept connection\n");
exit(1);
}
else printf("connection established, waiting for the file name\n");
i=0;
if((readCounter=read(socket2, filename, MAXBUF))>0)
i+=readCounter;
filename[i+1]='\0';
printf("reading from the file\n");
fd=open(filename, O_RDONLY);
if(fd==-1)
{
printf("could not open the file\n");
perror(" error is detected: ");
close(socket2);
continue;
}
else printf("file name is recieved, started copying\n");
readCounter=0;
while((readCounter=read(fd, buf, MAXBUF))>0)
{
writeCounter=0;
bufptr=buf;
while(writeCounter<readCounter)
{
readCounter-=writeCounter;
bufptr+=writeCounter;
writeCounter=write(socket2, bufptr, readCounter);
if(writeCounter==-1)
{
printf("could not write the file to client\n");
close(socket2);
continue;
}
}
}
close(fd);
close(socket2);
}
close(socket1);
return 0;
}
?
如果您不想预先选择默认项目。
其他信息 https://github.com/SAP/openui5/commit/b2191fd50e2115f8f9d2db7604a75fb50c57591f
答案 1 :(得分:3)
目前,没有。似乎没有更好的方法。 GitHub上有一张票。
答案 2 :(得分:1)
即使这个解决方案不是很好,我设法通过添加forceSelection = false属性以及控制器的onInit函数(我使用Select元素)来获得空字段:
var codeField = this.getView().byId("codeField");
setTimeout(function() {
codeField.insertItem(new sap.ui.core.ListItem({text: '', key: undefined}), 0);
}, 1000);
如果省略forceSelection = false,则该字段将过早或过晚加载到下拉列表,这将导致错误的选择可见。希望它可以帮到某人。
答案 3 :(得分:0)
您还可以扩展控件并使用例如构建自己的选择一个额外的参数添加空的选择...我实际上也在考虑...
答案 4 :(得分:0)
我也是避免与数据集混淆的观点,并且非常喜欢添加其他项聚合的想法。但是,我对此的改进是在控件本身上使用了格式化程序,因此它清晰可见并在适当的时间执行。 我使用带有完全合格控制器的格式化程序来将控件作为“ this”参数获取。在格式化程序功能中,按照@Victor S
的建议添加一个ListItem。在XML视图中
<Select forceSelection="false" selectedKey="{model>/key}" items="{path: 'model>/Items'}" icon="{path: '', formatter: 'mynamespace.Utils.addDeselectOption'}">
在Utils控制器中:
addDeselectOption: function() {
var that = this;
this.getBinding("items").attachDataReceived(function(){
that.insertItem(new sap.ui.core.ListItem({text: '', key: undefined}), 0);
});
}
在UI5 1.52中构成我