我正在处理一个项目,该项目将为存储在S3存储桶中的对象生成预签名URL。我有一个方法,它接受存储桶名称和路径名称,如果成功则返回预先指定的URL,或者如果发生异常则返回存储桶和路径的串联。我想要做的是在返回URL时显示直接下载链接,或者如果URL生成不成功,则显示带有连接桶/路径的文本(不链接)。我以为我可以做以下事情:
查看:
<div id="dataView">
<table>
<thead>
<tr>
<th>URL</th>
</tr>
</thead>
<tbody data-bind="foreach: data>
<tr>
<!-- ko if: urlIsValid -->
<td>
<a data-bind="attr: {href: location}" target="_blank">
Download
</a>
</td>
<!-- /ko -->
<!-- ko ifnot: urlIsValid -->
<td data-bind="text: location"></td>
<!-- /ko -->
</tr>
</tbody>
</table>
</div>
JS:
"use strict"
P.when('knockout', 'ready').register('data_model',
function(ko) {
var GetDataModel = function () {
var self = this;
self.urlIsValid = ko.observable();
self.data = ko.observableArray();
self.example = [ "https://www.example.com", "bucketName/pathName" ]
function isValidURL(urlToCheck) {
return urlToCheck.lastIndexOf("http", 0) === 0;
}
function pushData() {
for (var i = 0; i < example.length; ++i) {
self.urlIsValid = isValidURL(self.example[i]);
self.data.push ( {
location : self.example[i];
} );
}
}
}
var dataModel = GetDataModel();
ko.applyBindings(dataModel, document.getElementById('dataView'));
});
当点击页面上的按钮时,还有其他逻辑可以启动pushData
功能。不幸的是,我似乎无法弄清楚如何使链接/文本显示工作。我应该提一下,如果我删除<!-- ko if -->
和<!-- ko ifnot -->
语句,只是创建一个链接,无论情况如何,它都按预期工作。有关如何解决此问题的任何建议将不胜感激。
答案 0 :(得分:1)
基于绑定上下文,其中isValidURL嵌套在jsp-servlet
中我认为您可能希望isValidURL是数据数组的每个成员上的属性,而不是根视图模型上的属性。除非您在运行时更新这些链接,否则它也不需要是可观察的。
foreach:data
&#13;
var GetDataModel = function () {
var self = this;
self.data = ko.observableArray();
self.example = [ "https://www.example.com", "bucketName/pathName" ];
function isValidURL(urlToCheck) {
return urlToCheck.lastIndexOf("http", 0) === 0;
}
function pushData() {
for (var i = 0; i < self.example.length; ++i) {
//self.urlIsValid = isValidURL(self.example[i]);
self.data.push ( {
location : self.example[i],
urlIsValid: isValidURL(self.example[i])
});
}
}
setTimeout(pushData, 500);
}
var dataModel = GetDataModel();
ko.applyBindings(dataModel, document.getElementById('dataView'));
&#13;