Javascript 如何使用Knockout.js在表中显示文本或链接
我正在做一个项目,它将为存储在S3 bucket中的对象生成一个预先签名的URL。我有一个方法,它接受bucket名称和路径名称,如果成功,则返回预先签名的URL;如果发生异常,则返回bucket和路径的串联。我想做的是,如果返回URL,则显示直接下载链接;如果URL生成不成功,则显示带有连接的bucket/path的文本(而不是链接)。我想我可以做如下的事情: 视图:Javascript 如何使用Knockout.js在表中显示文本或链接,javascript,knockout.js,Javascript,Knockout.js,我正在做一个项目,它将为存储在S3 bucket中的对象生成一个预先签名的URL。我有一个方法,它接受bucket名称和路径名称,如果成功,则返回预先签名的URL;如果发生异常,则返回bucket和路径的串联。我想做的是,如果返回URL,则显示直接下载链接;如果URL生成不成功,则显示带有连接的bucket/path的文本(而不是链接)。我想我可以做如下的事情: 视图: 统一资源定位地址 基于isvalidul嵌套在foreach:data中的绑定上下文,我认为您可能希望isvalidul成为
统一资源定位地址
基于isvalidul嵌套在foreach:data
中的绑定上下文,我认为您可能希望isvalidul成为数据数组每个成员上的属性,而不是根视图模型上的属性。它也不需要是可见的,除非您在运行时更新这些链接
var GetDataModel=函数(){
var self=这个;
self.data=ko.observearray();
self.example=[”https://www.example.com“,“bucketName/pathName”];
函数isValidURL(urlToCheck){
返回urlToCheck.lastIndexOf(“http”,0)==0;
}
函数pushData(){
对于(变量i=0;i
统一资源定位地址
您正在覆盖可观察对象并打破数据绑定self.urlIsValid=isvalidul(self.example[i])
应该是一个函数赋值,比如self.urlIsValid(isvalidul(self.example[i])代码>感谢您指出这一点,但它仍然不起作用。当我取出ko if/ifnot语句(对JS没有任何更改)并让它无论如何创建一个链接时,它运行得非常好,但一旦我将ko if/ifnot语句放回,它就不起作用了。我在我的JS中放了一些警报,发现当包含ko if/ifnot语句时,它会在将数据推送到数组之前执行警报,但不会执行之后的警报。有什么想法吗?当你说链接不起作用时,你是说它根本没有被显示,还是说它显示了,但没有正确导航?它根本没有显示(实际上,表中没有显示任何内容——它似乎由于某种原因而挂起,因为我在self.data.push之后也没有执行任何内容)。如果在pushData中注释掉urlIsValid setter,并在定义时手动将urlIsValid设置为true(self.urlIsValid=ko.observable(true);
),是否显示链接?
<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>
"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'));
});