【问题标题】:Knockout observable array index in outside function在外部函数中剔除可观察数组索引
【发布时间】:2017-07-19 16:35:36
【问题描述】:

我有一个下拉菜单,允许用户选择某个月份。一个可观察的数组根据用户的选择改变了我的传单地图的层(完美地工作)。

现在我需要选择值myMonth(从零开始的月份数)用于另一个使用内容填充弹出窗口的函数。我只是没有找到在viewModel 函数之外使用变量myMonth 的有效解决方案......任何帮助都非常感谢!

这是我的代码,结果为: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);
        }
    }; 

【问题讨论】:

    标签: javascript arrays knockout.js


    【解决方案1】:

    我在您的代码中看到的唯一问题是声明

    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/

    【讨论】:

    • 大家好,非常感谢你们的 cmets!我整理了一个显示我的问题的 jsfiddle。(window.opener 解决方案对我不起作用)。 JSFIDDLE
    • @B.Mohr 更新了我的答案。请参阅编辑 1。
    • @Jason Spake:感谢您的智能解决方案和努力!帮了我很多!
    【解决方案2】:

    你所说的全局变量实际上是窗口对象的一个​​属性(例如参见this SO post)。

    这条评论:

    // popUp window content
    function onEachFeature(feature, layer) {
      if (feature.properties) {
      var popupContent = "Selected month: "+ myMonth;
            layer.bindPopup(popupContent);
        }
    }; 
    

    让我觉得您正试图从子弹出窗口中访问在父窗口中定义的变量myMonth,这是不可能的。

    您可以使用语法window.opener.myMonth 访问变量,如this doc 中所述。

    // popUp window content
    function onEachFeature(feature, layer) {
      if (feature.properties && window.opener) {
      var popupContent = "Selected month: "+ window.opener.myMonth;
            layer.bindPopup(popupContent);
        }
    }; 
    

    【讨论】:

      猜你喜欢
      • 2014-01-18
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 2016-11-12
      • 2015-01-02
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多