是否可以将子传递给ko计算函数作为参数

时间:2017-03-15 03:29:34

标签: javascript knockout.js

我有两个独立的敲除可观察数组。如果你在foreach结构中调用一个函数,那么函数是在$ root中。该元素可供您使用。但似乎计算函数的情况并非如此。是否可以使其适用于计算功能?这是一个说明情况的小提琴。

https://jsfiddle.net/ubvyeba8/1/

或者您可以运行下面的代码段。



function employee(empid, first, last){
  var self = this;
  this.empid = ko.observable(empid);
  this.first = ko.observable(first);
  this.last = ko.observable(last);
}

function model() {
  var self = this;
  this.employees = ko.observableArray('');
  this.employeesThatWorkInHR = ko.observableArray(['1','4','5'])
  this.testComputable = ko.computed(function(emp){
    if (emp){
    return true;
    }else{
    return false;
    }
  },this);
  this.testFunction = function(emp){
    if (emp){
    alert('true');
    }else{
    alert('false');
    }
  }
  
  
}

var mymodel = new model();

$(document).ready(function() {
  ko.applyBindings(mymodel);
  mymodel.employees.push(new employee('1','Fred','Smith'));
  mymodel.employees.push(new employee('2','John','Jones'));
  mymodel.employees.push(new employee('3','Mary','Jane'));
  mymodel.employees.push(new employee('4','Sue','Green'));
  mymodel.employees.push(new employee('5','Terrence','Small'));
});

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>


<table class="table">
<thead>
  <tr>
    <th>Id</th>
    <th>First</th>
    <th>Last</th>
    <th>is emp passed to computed</th>
    <th></th>
  </tr>
</thead>
<tbody data-bind="foreach: employees">
  <tr>
    <td data-bind="text: empid"></td>
     <td data-bind="text: first"></td>
     <td data-bind="text: last"></td>
     <td data-bind="text: $root.testComputable"></td>
     <td><button class="btn" data-bind="click: $root.testFunction">
        is emp passed to function
     </button></td>
  </tr>
</tbody>
</table>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:3)

在这个实例中使用计算机你想要完成什么?当一个值取决于其他可观察值的值时,使用计算函数,因此计算出的函数将跟踪相关值并相应地更新。如果你想要的是订阅你的可观察数组中的更改,那么你可以使用描述here的订阅函数(搜索&#39;明确订阅observables&#39;)。

订阅功能确实接受更新后的值作为其函数参数,因此您可以将其用于您的目的。一个计算函数不带参数(这就是为什么emp从未在你的例子中定义过),但你确实有这个&#39;这个&#39;您可以访问viewmodel中的其他属性。