在外部函数中敲除可观察的数组索引
我有一个允许用户选择某个月的下拉菜单。可观察数组根据用户选择(完美工作)更改我的传单地图的图层。在外部函数中敲除可观察的数组索引
现在我需要选择值myMonth
(基于零的月份数)为另一个函数填充弹出窗口的内容。我只是没有找到一个工作解决方案,使用变量myMonth
以外的viewModel
函数...任何帮助高度赞赏!
这里是我的代码,这会导致:popupcontent = "Selected month: undefined"
var myMonth; //global variable myMonth
//oberservable array
function viewModel() {
this.choices = ko.observableArray([
"January","February","March","April","May","June",
"July","August","September","October","November","December"]);
this.selectedChoice = ko.observable();
this.selectedChoice.subscribe(function(newValue) {
myMonth = this.choices.indexOf(this.selectedChoice());
myLayerGroup.clearLayers();
myLayerGroup.addLayer(myLayers[myMonth]);
console.log(myMonth); //works!
return myMonth; // no effect?!
},this);
};
ko.applyBindings(new viewModel());
// popUp window content
function onEachFeature(feature, layer) {
if (feature.properties) {
var popupContent = "Selected month: "+ myMonth;
layer.bindPopup(popupContent);
}
};
我与你的代码中看到的唯一问题是,声明
return myMonth; // no effect?!
绝对没有任何效果,因为它没有任何感知.subscribe函数内部。无处可以将价值返回到。
这里是一个fiddle显示你的代码工作非常像,所以我不清楚你有什么实际问题。是否有错误讯息?你打电话给onEachFeature
?
编辑1: 随着更新的提琴我现在可以看到的问题是,你的popupContent被设定一个时间在一开始,从不之后更新。 geoJSON函数立即调用onEachFeature函数来获取当前未定义的选定图层的内容,并将其永久存储为其内容。
popupContent似乎也期待一个扁平的字符串,所以可能没有办法让它以动态更新的方式进行更新。我想你必须在数据改变时重新创建图层,方法是再次调用geoJSON。
这里有一个更新的小提琴,我动了你的GeoJSON的呼叫转变为createLayer功能,以便它能够通过认购称为重建层:
this.selectedChoice.subscribe(function(newValue) {
myMonth = this.choices.indexOf(this.selectedChoice());
myLayerGroup.clearLayers();
myLayerGroup.addLayer(createLayer(myLayers[myMonth]));
}, this);
你所谓的全局变量实际上是窗口对象的一个属性(例如参见this SO post)。
此评论:
// popUp window content
function onEachFeature(feature, layer) {
if (feature.properties) {
var popupContent = "Selected month: "+ myMonth;
layer.bindPopup(popupContent);
}
};
让我觉得你是在试图访问该变量myMonth
,在父窗口定义,从一个孩子弹出,这是不可能用这种方式。
如this doc中所述,您可以使用语法window.opener.myMonth
访问该变量。
// popUp window content
function onEachFeature(feature, layer) {
if (feature.properties && window.opener) {
var popupContent = "Selected month: "+ window.opener.myMonth;
layer.bindPopup(popupContent);
}
};
嘿,伙计们,非常感谢您的意见!我放了一个显示我的问题的jsfiddle(window.opener解决方案不适合我)。 [JSFIDDLE](https://jsfiddle.net/bemo123/5rxcvjdw/) –
@ B.Mohr更新了我的答案。请参阅编辑1. –
@ Jason Spake:感谢您的智能解决方案和您的努力!帮助了我很多! –