如何将计算可观察量添加到 KNOCKOUTJS 映射中

How to add computed observable to knockoutjs mapping

本文关键字:添加 KNOCKOUTJS 映射 观察 计算      更新时间:2023-09-26

我正在使用映射插件根据从服务器发送的对象创建我的客户端视图模型。对象是基本地址信息,即:地址1,地址2,城市,州,邮政等...

绑定视图模型后,我希望在用户更改地址时更新谷歌地图画布。我创建了一个计算可观察量,用于检查输入的值并调用地图更新函数。当我不使用映射插件时,我之前有过这个工作,即模型是在本地定义的,但是一旦我引入了映射,我就无法将计算的可观察量附加到视图模型中。

我尝试按照映射插件文档中的说明进行操作,但计算的可观察量不会触发更新。我有一个自定义映射,它调用一个 mapModel,其中包含示例中计算的可观察量,但没有更新。

有什么想法吗?

$.getJSON("@Url.RouteUrl("
ContactUs_default ", new { action = "
GetPageModel ",  Model.BusinessID})", function(result) {
    //create map property
    result.Data.Map = null;
    var mapping = {
        'Map': {
            create: function(options) {
                return new mapModel(options.data);
            }
        }
    };
    var viewModel = ko.mapping.fromJS(result.Data, mapping);    
    ko.applyBindings(viewModel);
});
var mapModel = function(data) {
    ko.mapping.fromJS(data, {}, this);
    this.Map = ko.computed(function() {
        var address = "";
        var enteredElements = 0;
        if (this.Address1 != helpText) {
            address += " " + this.Address1;
            enteredElements++;
        }
        if (this.Address2 != helpText) {
            address += " " + this.Address2;
        }
        if (this.City != helpText) {
            address += " " + this.City;
            enteredElements++;
        }
        if (this.State != helpText) {
            address += " " + this.County;
            enteredElements++;
        }
        if (this.PostalCode != helpText) {
            address += " " + this.Postal;
        }
        alert("hi");
        //only upate map if enough data has been entered to give accruate location
        if (enteredElements >= 3) {
            MYMAP.placeMarkers(address);
        }
    }, this);
};​

当您通过映射插件发送数据时,您的所有属性都将成为可观察量。

这意味着您需要像这样访问它们

    if (this.Address1() != helpText) {
        address += " " + this.Address1();
        enteredElements++;
    }

当您在计算的可观察量中将它们作为可观察量访问时,它将创建依赖项。 因此,目前计算的可观察量将得到初始评估,但它永远不会再次更新,因为它不访问任何可观察量的值。