繁体   English   中英

访问Knockout JS中的普通JS数组内的observable的值?

[英]Accessing the value of an observable inside a plain JS array in Knockout JS?

背景

我有一个普通的JS数组,最初是空的。 我稍后用值填充它。 发送给它的值是可观察到的数字。 稍后,我想将这些值与另一个可剔除的可观察数组中的值进行比较。 我的问题是,每当我在数组循环中传递当前项目的索引并传递该索引值(一个数字!)时,该数组就会返回一个函数。 要了解一个想法,请查看下面的JS。

请注意,我的项目和实际脚本在JSBin上可见。 此外,要在控制台中查看问题,您必须添加分配,然后按“排序”。

JSBinhttp//jsbin.com/fehoq/177/edit] 1

JS

//example script that follows actual script

var _this = this;

//initialize my array
this. lowest = [];

// I want to compare values in lowest to values in this array
this.scores = ko.observableArray();

// method that does comparison
this.myMethod = function(){

    // initialize my helper, k
    var k;  
     ...

    // loop through one array
    ko.utils.arrayForEach(_this.scores(), function (score) {

        // make sure my value is a number...
        if (!isNaN(parseFloat(score()))) {

           // this is important, I need to current index for comparison
           k = _this.scores.indexOf(score);
           console.log(k);

           // this is where things break - it prints a function, not a value!
           console.log(_this.lowest[k]);

           // useless check, the value is a function, so they're always different
           if (score()!=_this.lowest[k]){
             // do stuff
           }
        }
    }
}

更新

放入我正在使用的方法,也许有人会注意到我的语法是正确的吗?

this.mean = (function(scores,i) {
  var m = 0;
  var count = 0;
  var k;

  ko.utils.arrayForEach(_this.scores(), function(score) {

    console.log([typeof score(), score()]);

    if (!isNaN(parseFloat(score()))) {

      console.log(i);
      console.log(_this.lowest[i]);

      if (score() != _this.lowest[i]) {
        m += parseFloat(score());
        count += 1;
      }

    }

  });

 if (count) {
    m = m / count;
    return m.toFixed(2);
  } else {
    return 'N/A';
  }
});
}

更新2

万一有人徘徊在这里,因为我的问题仍然没有解决。 下面的代码是如何设置的值lowest

this.dropLowestScores = function() {
    ko.utils.arrayForEach(_this.students(), function(student){
        var comparator = function(a,b){
          if(a()<b()){
            return 1;
          } else if(a() > b()){
            return -1;
          } else {
            return 0;
          }
        };       
        var tmp = student.scores().slice(0);
        tmp.sort(comparator);
        student.lowest = ko.observableArray(tmp.splice((tmp.length-2),tmp.length-1));
    });
};

待解决的问题,2014年5月9日

  1. Jeremy的脚本运行,但没有预期的效果。 例如, console.log(_this.lowest[k])打印undefined ,就像我的一样。 此外,匹配的分数不会被跳过,而是应该被跳过。

  2. Jeremy的脚本指定了lowest的ko.observable。 我的脚本现在的ko.observable也lowest ,但是为什么普通的JS数组不应该这样做呢? 单击绑定到的按钮时,我只需要进行lowest的更新,并且这些绑定已经处理完毕。

这就是可观察性在淘汰赛中的工作方式。

创建一个函数时,就是在创建一个函数。

var myObservable1 = ko.observable(); // Create it.
var myObservable2 = ko.observable("Hola!"); // Create it with a value.

console.log(typeof myObservable2); // It is indeed a function
console.log(typeof myObservable2()); // That returns a string
console.log(myObservable2()); // And get the value.

根据评论中的问题进行编辑

var koTest = ko.observableArray();
koTest.push("Line0");
koTest.push("Line1");
koTest.push("Line2");
koTest.push("Line3");
koTest.push("Line4");

var jsTest = [];
jsTest.push("Line0");
jsTest.push("Line1");
jsTest.push("Line2");
jsTest.push("Line3");
jsTest.push("Line4");


alert(koTest()[2]);
alert(jsTest[2]);
alert(koTest()[2] === jsTest[2]);

测试代码

我继续对您的代码进行了可运行的测试,一切对我来说都很好。 我不得不作出有关的内容,一些假设_this -特别声明lowest ,这是我做了observableArray根据如何你访问它。

无论如何,此代码运行:

    var _this = {
        scores: ko.observableArray(),
        lowest: ko.observableArray()
    };


    var mean = (function(scores) {
        var m = 0;
        var count = 0;
        var k;


        ko.utils.arrayForEach(_this.scores(), function(score) {

            console.log([typeof score(), score()]);

            if (!isNaN(parseFloat(score()))) {
                k = _this.scores.indexOf(score);
                console.log(k);
                console.log(_this.lowest[k]);
                if (score() != _this.lowest[k]) {
                    m += parseFloat(score());
                    count += 1;
                }

            }


        });


        if (count) {
            m = m / count;
            return m.toFixed(2);
        } else {
            return 'N/A';
        }
    });

    for (var i = 0; i < 10; i++) {
        _this.scores.push(ko.observable(i));
    }

    var m = mean();
    alert(m);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM