在我的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");
}
});
};
我在 View 模型中调用此函数,但当我调用此函数时出现此错误
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.
有什么解决办法吗??
最佳答案
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
的PopulateBranches
不应该是ko.computed
也可以是普通函数。 ko.computed
当您想要基于另一个可观察值计算一个值时,应该使用该值,例如,如果您有一个以秒为单位的可观察跟踪耗时,则可以使用 ko.computed
为了计算所用时间的字符串表示形式,每当可观察值发生变化时,knockout 都会自动重新计算该字符串。
关于javascript - 除非指定 'write' 选项,否则会计算 knockout js 未捕获错误 : Cannot write a value to a ko.。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25719274/