在外部函数中敲除可观察的数组索引

在外部函数中敲除可观察的数组索引

问题描述:

我有一个允许用户选择某个月的下拉菜单。可观察数组根据用户选择(完美工作)更改我的传单地图的图层。在外部函数中敲除可观察的数组索引

现在我需要选择值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); 

https://jsfiddle.net/jlspake/5rxcvjdw/1/

+0

嘿,伙计们,非常感谢您的意见!我放了一个显示我的问题的jsfiddle(window.opener解决方案不适合我)。 [JSFIDDLE](https://jsfiddle.net/bemo123/5rxcvjdw/) –

+0

@ B.Mohr更新了我的答案。请参阅编辑1. –

+0

@ Jason Spake:感谢您的智能解决方案和您的努力!帮助了我很多! –

你所谓的全局变量实际上是窗口对象的一个​​属性(例如参见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); 
    } 
};