Javascript 点击knockout.js下载文件

Javascript 点击knockout.js下载文件,javascript,jquery,knockout.js,Javascript,Jquery,Knockout.js,html <tbody data-bind="foreach: arrayList"> <tr> <td><a href="#" data-bind="click: $parent.downloadLastFile">Download</a></td> </tr> </tbody> 我试图在单击时下载一个文件。这段代码不起作用。有人能检查一下吗? 我看不到您的模型中定

html

<tbody data-bind="foreach: arrayList">
    <tr>
        <td><a href="#" data-bind="click: $parent.downloadLastFile">Download</a></td>
    </tr>
</tbody>
我试图在单击时下载一个文件。这段代码不起作用。有人能检查一下吗?

  • 我看不到您的模型中定义的
    self
    变量
  • 由于我在您的
    单击
    绑定中看到
    $parent
    ,我假设应该有一个父模型,您可以在该模型中定义数据并将数据分配给
    ArrayList
  • 由于您使用的是
    knockout click binding
    ,因此无需再次使用
    jquery
    knockout click函数
    (“#download_div”)
    。错
下面只是一个你如何做到这一点的例子

例如:

JS:

  • 我看不到您的模型中定义的
    self
    变量
  • 由于我在您的
    单击
    绑定中看到
    $parent
    ,我假设应该有一个父模型,您可以在该模型中定义数据并将数据分配给
    ArrayList
  • 由于您使用的是
    knockout click binding
    ,因此无需再次使用
    jquery
    knockout click函数
    (“#download_div”)
    。错
下面只是一个你如何做到这一点的例子

例如:

JS:


ViewModel
中没有
ArrayList
属性,您的
没有关闭,并且在您的单击处理程序中有一个奇怪的
(“#download_div”)
。请修复代码中明显的语法错误,并提供与此问题相关的所有代码。
ViewModel
中没有
ArrayList
属性,您的
未关闭,并且单击处理程序中有一个奇怪的
(“#下载div”)
。请修复代码中明显的语法错误,并提供与问题相关的所有代码。嘿,我已经编辑了这个问题。你能再看一遍吗?@lola我提供的JSfiddle示例工作得很好。您应该能够查看它,修改自己的代码并使其工作。在更新的问题
ArrayList
中,从未使用
ItemViewModel
填充。更好的做法是在父VM中定义一次单击函数,而不是为每一行定义。你能再看一遍吗?@lola我提供的JSfiddle示例工作得很好。您应该能够查看它,修改自己的代码并使其工作。在更新的问题
ArrayList
中,从未使用
ItemViewModel
填充。更好的做法是在父VM中一次性定义click函数,而不是为每一行定义。
    function ItemViewModel(item){
    if(!$.isEmptyObject(item)){
      var self = this;
      self.lastFile = ko.observable(item.file_name);    

      self.downloadLastFile = function(row) {
         console.log(row.lastFile());
         var link = document.createElement('a');
         link.href = data;
         link.download = row.lastFile();
         document.body.appendChild(link);
         link.click();
        }
     }
   }
function MainViewModel() {
    var self = this;
    self.arrayList= ko.observableArray();
}
dataModel = new MainViewModel();
ko.applyBindings(dataModel);
var data = [{id:1, file_name : "file_name1"},{id:2, file_name : "file_name2"}];

function AppViewModel(){
   var self = this;
   self.ArrayList = ko.observableArray($.map(data, function (item) {
          return new ItemViewModel(item);
    }));

   self.downloadLastFile = function(item) {
     console.log(item.lastFile());
     var link = document.createElement('a');
    link.href = data;
    //here you append your rootURL to the file name
    link.download = item.lastFile();
    document.body.appendChild(link);
    link.click();
   }
 }

 var ItemViewModel = function(data){
   var self = this;
   self.lastFile = ko.observable(data.file_name);
 }

var viewModel = new AppViewModel();
ko.applyBindings(viewModel);