Knockout绑定值不适用于模型

时间:2017-04-18 13:10:54

标签: knockout.js

我写了一个自定义绑定。当我尝试使用它来创建表时,相应的单元格中不会出现任何值。我知道它正在使用一个日志语句接收一个值,它正在我在函数中执行我需要的操作,但即使我尝试返回表中没有显示的内容。我做错了什么?我不太了解自定义绑定。

         ko.bindingHandlers.sizeInMB = {
            init: function(element, valueAccessor){
                    var size = valueAccessor();
                    if      (size>=1000000000){size=(size/1000000000).toFixed(2)+' GB';}
                    else if (size>=1000000){size=(size/1000000).toFixed(2)+' MB';}
                    else if (size>=1000){size=(size/1000000).toFixed(2)+' MB';}
                    else if (size>1){size=size/1000000+' MB';}
                    else if (size==1){size=size/1000000+' MB';}
                    else{size='0 MB';}
                //console.log(size);
                ko.applyBindingsToNode(element, {value: size});
            }
    };
        ko.bindingHandlers.fileType = {
            init: function(element, valueAccessor){
                    var name = valueAccessor();
                    var type = name.split('.').pop();
                ko.applyBindingsToNode(element, {value: type});
            }
    };
<!-- ko foreach: multiFileData().fileArray -->
<tr>
<td><span class="attachName" data-bind="text:name"></span></td>
<td><span data-bind="sizeInMB: size"></span></td>
<td><span data-bind="fileType: name"></span></td>
</tr>
<!-- /ko -->

1 个答案:

答案 0 :(得分:0)

您正在将value绑定应用于非输入元素。您可能希望使用text绑定,或者将<span>元素替换为<input> s。

&#13;
&#13;
ko.bindingHandlers.sizeInMB = {
  init: function(element, valueAccessor) {
    var size = valueAccessor();
    if (size >= 1000000000) {
      size = (size / 1000000000).toFixed(2) + ' GB';
    } else if (size >= 1000000) {
      size = (size / 1000000).toFixed(2) + ' MB';
    } else if (size >= 1000) {
      size = (size / 1000000).toFixed(2) + ' MB';
    } else if (size > 1) {
      size = size / 1000000 + ' MB';
    } else if (size == 1) {
      size = size / 1000000 + ' MB';
    } else {
      size = '0 MB';
    }
    //console.log(size);
    ko.applyBindingsToNode(element, {
      text: size
    });
  }
};

ko.bindingHandlers.fileType = {
  init: function(element, valueAccessor) {
    var name = valueAccessor();
    var type = name.split('.').pop();
    ko.applyBindingsToNode(element, {
      text: type
    });
  }
};

ko.applyBindings({ files: [ { name: "Some.Name", size: 1012302391 } ] });
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<!-- ko foreach: files -->
<div>
  <span data-bind="text:name"></span>
  <span data-bind="sizeInMB: size"></span>
  <span data-bind="fileType: name"></span>
</div>
<!-- /ko -->
&#13;
&#13;
&#13;