找不到索引形式observablearray knockout.js

时间:2013-11-29 19:48:47

标签: knockout.js

我正在尝试从observableArray中找到索引(主要是我会从这里获取产品价格)。

我正在使用 indexOf

但它始终返回 -1

我认为模特是。

var myviewmodel = function(){
var self = this;
    self.SetId = ko.observable();
    self.ProductId=ko.observable();
    self.Productname=ko.observable();
    self.Products = ko.observableArray([{"ProductId":"5dca48ae-5378-4c2b-a8ea-17702b722d4f","Productname":"Prd1","Price":12.00},{"ProductId":"8b91a6e6-e9b4-4dc4-b32d-2fdba61cb707","Productname":"Prd2","Price":777.00}]);

     self.changeProp = function (text) {
        var AllProducts = text.Products();
              console.log(ko.toJSON(AllProducts));
              console.log(self.SetId());
         //var thisindex = text.Products().indexOf(self.SetId());
var thisindex = AllProducts.indexOf(self.SetId());//text.Products().length;
         console.log(thisindex);  

         //var Price = text.Products()[thisindex].Price;
           //  console.log("Price: "+ Price);

           }
}
ko.applyBindings(new myviewmodel());

我正在使用knockout.js版本2.1.0

任何人请告诉我解决方案。我已经复制了代码here.

1 个答案:

答案 0 :(得分:0)

使用optionsValue: 'ProductId'设置,告诉KO使用ProductId值存储在SetId属性中。

但是,在您的AllProducts中,您仍会存储整个产品对象,因此AllProducts.indexOf(self.SetId());将返回-1,因为它不知道应该将您的SetId与哪个属性进行比较。< / p>

一种解决方案是使用ko.utils.arrayMap创建一个包含ID的AllProducts的新数组,并使用indexOf

var thisindex = ko.utils.arrayMap(AllProducts, function(item){ 
    return item.ProductId; }).indexOf(self.SetId());
console.log(thisindex); 

演示JSFiddle

或者您可以告诉KO在SetId属性中设置您的整个Product对象(在这种情况下,您可能应该重命名该属性)并删除optionsValue: 'ProductId'设置,在这种情况下,您不要完全需要indexOf来电,你可以写:

console.log("Price: "+ self.SetId().Price);

演示JSFiddle

或者如果你只需要价格,你可以使用optionsValue: 'Price'在这种情况下,SetId属性将直接存储所选价格。