我正在尝试从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.
答案 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
属性将直接存储所选价格。