2012-04-11 59 views
4

我使用的映射基于插件的,但未通过服务器发送的对象上创建我的客户端视图模型。该对象是基本地址信息,即:地址1,地址2,城市,州,邮政等...如何添加计算的可观测到knockoutjs映射

一旦视图模型被绑定,我想谷歌地图画布更新,如果用户更改地址。我创建了一个计算观察值,用于检查输入的值并调用地图更新函数。当我没有使用映射插件时,我有这个工作,即模型是在本地定义的,但是一旦我引入了映射,我无法将计算的observable追加到视图模型。

我试图从映射插件documentation以下的说明中,但是计算观察到的没有触发的更新。我有一个自定义的映射,它调用了一个mapModel,它包含像例子中那样计算的observable,但没有更新。

任何想法?

$.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); 
};​ 

回答

2

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

这意味着你需要访问他们作为一个功能类似像:

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

当您访问他们作为一个可观察观测计算里面,那么它会创建一个依赖。因此,目前您的计算的观测值会得到初始评估,但它不会再次更新,因为它不访问任何观察值。

+0

作出改变,但现在我得到一个“联系人:340Uncaught类型错误:对象的翻译:有没有方法“地址1”错误指向计算观察到的。 – Jerry 2012-04-11 16:37:25

+0

看起来它mapModel在铬JS调试器,它的性质是“地图”和“__ko_mapping__”。如何访问映射插件设置的模型的其他属性? – Jerry 2012-04-11 16:45:26

+2

这里,也许你可以修改证明的东西更贴近您的方案小提琴:http://jsfiddle.net/rniemeyer/RUsp2/。我不确定你的数据看起来像什么。它看起来像你的结果数据有一个'Map'属性,但是你也创建了一个'Map'计算的observable作为它的一个孩子。 – 2012-04-11 16:59:09