您好我在应用google地图绑定后使用ko.toJSON和ko.mapping.toJSON返回无效状态错误时遇到问题。我应该将viewmodel发布回mvc控制器。我已经设法在一个简单的viewmodel中重现了这个问题。有没有办法剥离googlemap和标记或有替代方法?我做错了什么?
<script src="/Scripts/knockout-2.3.0.debug.js"></script>
<script src="/Scripts/knockout.mapping-latest.debug.js"></script>
<script src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
<script type="text/javascript">
function MyViewModel() {
var self = this;
self.test = ko.observable('Hello');
self.mapOne = ko.observable({
lat: ko.observable(12.24),
lng: ko.observable(24.54)
});
self.mapTwo = ko.observable({
lat: ko.observable(40.76),
lng: ko.observable(-73.98)
});
self.save = function () {
//Invalid state error occurs here!
var jsonData = ko.toJSON(self);
};
}
ko.bindingHandlers.map = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var mapObj = ko.utils.unwrapObservable(valueAccessor());
var latLng = new google.maps.LatLng(
ko.utils.unwrapObservable(mapObj.lat),
ko.utils.unwrapObservable(mapObj.lng));
var mapOptions = {
center: latLng,
zoom: 6,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
mapObj.googleMap = new google.maps.Map(element, mapOptions);
mapObj.marker = new google.maps.Marker({
map: mapObj.googleMap,
position: latLng,
title: "You Are Here",
draggable: true
});
mapObj.onChangedCoord = function (newValue) {
var latLng = new google.maps.LatLng(
ko.utils.unwrapObservable(mapObj.lat),
ko.utils.unwrapObservable(mapObj.lng));
mapObj.googleMap.setCenter(latLng);
};
mapObj.onMarkerMoved = function (dragEnd) {
var latLng = mapObj.marker.getPosition();
mapObj.lat(latLng.lat());
mapObj.lng(latLng.lng());
};
mapObj.lat.subscribe(mapObj.onChangedCoord);
mapObj.lng.subscribe(mapObj.onChangedCoord);
google.maps.event.addListener(mapObj.marker, 'dragend', mapObj.onMarkerMoved);
$("#" + element.getAttribute("id")).data("mapObj", mapObj);
}
};
var viewModel = new MyViewModel();
$(document).ready(function () {
ko.applyBindings(viewModel);
});
</script>
<div id="map1Div" data-bind="style: { width: '300px', height: '300px' }, map: mapOne"></div>
<input data-bind="value: mapOne().lat" />
<input data-bind="value: mapOne().lng" />
<button class="btn btn-primary" type="submit" data-bind="click: save">Save</button>
任何帮助将不胜感激
答案 0 :(得分:2)
问题是由于将额外的Google地图属性添加到原始viewModel引起的。当映射遇到它们时,它不知道该怎么做。如果将它们放在一个单独的对象中,它似乎可以工作。 mapObjVM
是原始的viewModel,mapObj
是google maps props容器:
ko.bindingHandlers.map = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var mapObjVM = ko.utils.unwrapObservable(valueAccessor());
var mapObj = {};
var latLng = new google.maps.LatLng(
ko.utils.unwrapObservable(mapObjVM.lat),
ko.utils.unwrapObservable(mapObjVM.lng));
var mapOptions = {
center: latLng,
zoom: 6,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
mapObj.googleMap = new google.maps.Map(element, mapOptions);
mapObj.marker = new google.maps.Marker({
map: mapObj.googleMap,
position: latLng,
title: "You Are Here",
draggable: true
});
mapObj.onChangedCoord = function (newValue) {
var latLng = new google.maps.LatLng(
ko.utils.unwrapObservable(mapObjVM.lat()),
ko.utils.unwrapObservable(mapObjVM.lng()));
mapObj.googleMap.setCenter(latLng);
};
mapObj.onMarkerMoved = function (dragEnd) {
var latLng = mapObj.marker.getPosition();
mapObjVM.lat(latLng.lat());
mapObjVM.lng(latLng.lng());
};
mapObjVM.lat.subscribe(mapObj.onChangedCoord);
mapObjVM.lng.subscribe(mapObj.onChangedCoord);
google.maps.event.addListener(mapObj.marker, 'dragend', mapObj.onMarkerMoved);
$("#" + element.getAttribute("id")).data("mapObj", mapObj);
}
};