从KO.Observable获取对象

时间:2017-02-03 15:54:20

标签: c# asp.net-mvc knockout.js

抱歉新手问题,我正在使用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);

3 个答案:

答案 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