我是javascript的新手,我正在研究knockooutjs库,开始在我的应用程序中使用它。我用一些方法声明了命名空间和viewmodel。一切都按预期工作,直到我调用OnTemplateChange。然后addIp和removeIp方法不再起作用了。
我在一个单独的文件中声明了一个命名空间:
var omega = omega || {};
这是我在另一个文件中的viewmodel的代码。我从FranchiseData控制器获取Json数据,我使用映射插件来创建viewmodel可观察属性。
$(function () {
omega.franchiseInfo = {}
$.getJSON("FranchiseData", function (data) {
//using the mapping plugin
omega.franchiseInfo = ko.mapping.fromJS(data);
//declare an observable array for some custom logic to handle when json data is received from the server
omega.franchiseInfo.Ips = ko.observableArray([]);
if (data.ServerIps.length === data.ServerPorts.length) {
for (var i = 0; i < data.ServerIps.length; i++) {
omega.franchiseInfo.Ips.push({ ip: ko.observable(data.ServerIps[i]), port: ko.observable(data.ServerPorts[i]) });
}
}
ko.applyBindings(omega.franchiseInfo);
});
onTemplateChange = function (value) {
var template = $("#networks :selected").val();
$.getJSON("FranchiseData", { network: template }, function (data) {
omega.franchiseInfo = ko.mapping.fromJS(data);
omega.franchiseInfo.Ips = ko.observableArray([]);
}
save = function () {
$.ajax({
url: "/Home/Save",
type: "POST",
//data: ko.toJSON({ folderName: FolderName }),
data: ko.toJSON(this),
contentType: "application/json; charset=utf-8",
dataType: 'json',
success: function (result) { alert("result") }
});
}
addIp = function () {
if (omega.franchiseInfo.Ips().length < 10) {
omega.franchiseInfo.Ips.push({ ip: ko.observable(), port: ko.observable() });
}
}
removeIp = function () {
if (omega.franchiseInfo.Ips().length > 1) {
omega.franchiseInfo.Ips.pop();
}
}
)}
当调用onTemplateChange方法时,我再次进行映射,因为我无法在页面加载时使用第一个Json调用的可观察方法。而且addIp和removeIp不再起作用。我认为我的范围有问题,两次映射是错误的。
如果我尝试声明franchiseInfo视图模型的方法如下:
omega.franchiseInfo = {
Ips: ko.observableArray([])
};
Ips数组在$.getJSON("FranchiseData", function (data)
范围内未定义。
任何帮助将不胜感激。我非常坚持这一点。如果事情不清楚,我会给出进一步的解释。谢谢。
答案 0 :(得分:0)
在$ .getJSON之后(我希望结束像})或});
此外,您已将omega.franchiseInfo.Ips声明为observableArray
那么你为什么不这样做呢? omega.franchiseInfo.Ips([])