0

我有这样的设置:views/people 和 viewsModel/people.js 之间的敲除绑定 A button to call AJAX to jsreport server to print PDF Button in views/people

<button id="printPdf"
data-bind="ojComponent: {component: 'ojButton}">
</button>

在 viewsModel/people.js 中,对 jsreport 服务器的点击事件调用

self.someotherstuff = ko.pureComputed(function () {
......
//print button
self.print = $("#printPdf").click(function () {
$.getJSON(
//some logic
).then(function (){jsreport.serverUrl = 'http://localhost:5488';
var request = {
template: { 
"shortid":"rJPUhdmv"
 }};
 jsreport.render('_blank', request);       
 })
....
}

但是为什么总是收到 2 个 GET 请求而不是 1 个呢?编辑:整个打印按钮在上面的纯计算中

4

1 回答 1

3

每当其依赖项之一发生更改时,都会重新评估A ko.computedor 。ko.pureComputed这意味着您不应该在 a的方法中附加事件侦听器pureComputed

另请注意,pureComputed根据定义, a 不应有任何副作用。举个例子:

var counter = 0;
var dependency = ko.observable("A");

var myComputed = ko.computed(function() {
  counter += 1;
  return dependency() + "-computed";
});

dependency("B");
dependency("C");

console.log(counter); // Logs 3
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

如您所见,myComputed被评估了三遍。

  1. 在其初始化时(输出A-computed:)
  2. 何时dependency更新为B(输出B-computed:)
  3. 何时dependency更新为C(输出C-computed:)

您应该在视图模型中创建一个onClick方法,并使用以下方法绑定它data-bind="click: onClick"

self.onClick = function(data, event) {
  // Ajax stuff...
}

和:

<button id="printPdf"
  data-bind="click: onClick, ojComponent: {component: ojButton}">
</button>

你没有显示你的自定义ojComponent绑定,所以我不能确定它是否与click绑定冲突......

于 2016-07-20T10:52:13.373 回答