如何使用Knockout.js在表格中显示文本或链接

时间:2017-08-04 22:35:28

标签: javascript knockout.js

我正在处理一个项目,该项目将为存储在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 -->语句,只是创建一个链接,无论情况如何,它都按预期工作。有关如何解决此问题的任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

基于绑定上下文,其中isValidURL嵌套在jsp-servlet中我认为您可能希望isValidURL是数据数组的每个成员上的属性,而不是根视图模型上的属性。除非您在运行时更新这些链接,否则它也不需要是可观察的。

&#13;
&#13;
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;
&#13;
&#13;