抱歉新手问题,我正在使用KnockoutJS
,我正在尝试从一个observable获取base64String值,并将其存储在另一个observable中,然后再将其发送出去。
为什么我需要这样做? 好吧,由于某种原因,当base64String被传递时,它有多个层到该对象,并以NULL形式发送。
任何帮助或建议都将不胜感激。
var CreateSalesVM = {
UserId: ko.observable(),
Name: ko.observable(),
Phone: ko.observable(),
Email: ko.observable(),
Item: ko.observable(),
Description: ko.observable()
这件作品是我遇到的问题
IMAGETWO: ko.observable({
base64StringArray: ko.observableArray()
}),
IMAGE: ko.computed({
read: function () {
return IMAGETWO().base64StringArray();
},
deferEvaluation: true
}),
/ ************** \
btnCreateSales: function () {
// IMAGE = this.IMAGETWO().base64StringArray();
console.log("Image text ", this.IMAGE());
//console.log("Host usrl ", urlHostPath);
//console.log("Ko is ", ko.toJSON(this));
$.ajax({
url: urlPath,
type: 'post',
dataType: 'json',
data: ko.toJSON(this),
contentType: 'application/json',
success: function (result) {
//console.log("This was a success");
// window.location.href = urlPath + '/';
alert(ko.toJSON(this));
// console.log("Ko is ", ko.toJSON(this));
},
error: function (err) {
//console.log("Ko is ", ko.toJSON(this));
if (err.responseText == "success")
{
//console.log("This was an erro success", urlPath);
// window.location.href = urlPath + '';
}
else {
alert(err.responseText);
// console.log("This was an error ", urlHostPath );
}
},
complete: function () {
}
});
}
};
ko.applyBindings(CreateSalesVM);
答案 0 :(得分:2)
IMAGETWO
是VM对象的一种方法。您必须在调用函数时指定对象,否则它将在全局范围内查找它。所以,你可以使用:
IMAGE: ko.computed({
read: function () {
return this.IMAGETWO().base64StringArray();
},
deferEvaluation: true
}, CreateSalesVM)
或
IMAGE: ko.computed({
read: function () {
return CreateSalesVM.IMAGETWO().base64StringArray();
},
deferEvaluation: true
})
答案 1 :(得分:0)
此操作失败,因为您没有指定要调用IMAGE
的对象(默认情况下,它将在window
上调用)。
在IMAGE
中,您的视图模型尚不存在,因为您使用的是对象表示法。
您需要更改定义视图模型的方式,从对象到类,并在IMAGETWO().base64StringArray();
中添加对象,如下所示:
var CreateSalesVM = function () {
var self = this;
this.UserId = ko.observable();
this.Name = ko.observable();
this.Phone = ko.observable();
this.Email = ko.observable();
this.Item = ko.observable();
this.Description = ko.observable();
this.IMAGETWO = ko.observable({
base64StringArray: ko.observableArray()
});
this.IMAGE = ko.computed({
read: function () {
return self.IMAGETWO().base64StringArray();
//^^^^ note this
},
deferEvaluation: true
});
}
var myViewModel = new CreateSalesVM();
答案 2 :(得分:0)
每当您调用 ko.toJSON()时,您都会获得序列化为 JSON 的VM副本。在这种情况下,您需要使用 ajax 发布对象,您所要做的就是覆盖 toJSON()函数以删除 IMAGETWO 属性并添加 IMAGE 属性以及所需的转换(到base 64)。
var CreateSalesVM = {
UserId: ko.observable(),
Name: ko.observable(),
Phone: ko.observable(),
Email: ko.observable(),
Item: ko.observable(),
Description: ko.observable(),
IMAGETWO: ko.observable({base64StringArray: ko.observableArray()})
}
CreateSalesVM.prototype.toJSON = function() {
var copy = ko.toJS(this); // clean copy
copy.IMAGE = this.IMAGETWO().base64StringArray(); // create desired property to send
delete copy.IMAGETWO; //remove the undesired property
return copy; //return the copy
};
查看原始帖子here。