在我的js中我点击一个函数点击这里是我的功能
function PopulateBranch(branchAreaName) {
var nodePath = "/content/eng/phone-numbers/jcr:content/content-page/wireframe";
$.ajax({
data: "action="+"getBranch"+ "&nodePath=" + nodePath + "&nodeName=" + branchAreaName,
url: '/bin/branchlocator/crud' ,
dataType: 'json',
type: 'GET',
success: function (data) {
self.PopulateBranch = ko.computed(function(){
ko.utils.arrayForEach(data, function(item){
branchView.Branches.push(new Branch(item));
});
});
},
error: function (exception) {
alert("fail");
}
});
};
我在视图模型中调用此函数,但是当我调用此函数时,我收到此错误
Uncaught Error: Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.
任何解决方案??
答案 0 :(得分:2)
function PopulateBranch(branchAreaName) { ... }
是代码中的全局函数。当你第一次打电话时,会发生这种情况:
您致电PopulateBranch("someAreaName")
。
进行AJAX调用。
当AJAX调用成功时,将调用成功处理程序并执行以下代码:self.PopulateBranch = ko.computed(...);
。您在范围内没有名为self
的变量,因此它会解析为window.self
,等于window
,也称为全局范围。这意味着这行代码用新的function PopulateBranch(branchAreaName) { ... }
处理程序替换旧的ko.computed
。
下次拨打PopulateBranch("someAreaName")
时,您不再呼叫原始PopulateBranch()
功能,而是拨打ko.computed
版本。
要解决您的问题,您应该删除该self.PopulateBranch = ko.computed(...);
行,并将其替换为更新Branches
数组的不同代码。也许你只需要这个:
success: function(data) {
ko.utils.arrayForEach(data, function(item) {
branchView.Branches.push(new Branch(item));
});
}
顺便说一下,我认为你误解了ko.computed
的使用。 BranchAreaViewModel
' s PopulateBranches
也不应该是ko.computed
,它可以是普通的功能。当您想要根据另一个可观察值计算值时,应使用ko.computed
,例如,如果您有一个可观察的跟踪经过时间(以秒为单位),则可以使用ko.computed
计算字符串表示形式经过的时间,每当可观察值发生变化时,淘汰赛都会自动重新计算该字符串。