Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用KnockoutJS创建对象的关联数组_Javascript_Object_Knockout.js_Associative Array_Knockout 3.0 - Fatal编程技术网

Javascript 如何使用KnockoutJS创建对象的关联数组

Javascript 如何使用KnockoutJS创建对象的关联数组,javascript,object,knockout.js,associative-array,knockout-3.0,Javascript,Object,Knockout.js,Associative Array,Knockout 3.0,我不熟悉knockoutJS,但我正在将这个容器对象存储到一个可观察的数组中。同时,我需要能够通过其唯一id(mmsi)或其名称在数组中搜索特定对象。我假设为了做到这一点,数组必须是关联的,这样你就可以搜索所有的键,直到找到你搜索过的值为止。然而,我对我的建议没有信心,我可以提供一些指导 以下是我所拥有的: 功能容器(数据){ this.mmsi=ko.可观察(data.mmsi); this.lat=ko.可观测(数据纬度); this.long=ko.可观测(数据经度); this.tru

我不熟悉knockoutJS,但我正在将这个容器对象存储到一个可观察的数组中。同时,我需要能够通过其唯一id(mmsi)或其名称在数组中搜索特定对象。我假设为了做到这一点,数组必须是关联的,这样你就可以搜索所有的键,直到找到你搜索过的值为止。然而,我对我的建议没有信心,我可以提供一些指导

以下是我所拥有的:

功能容器(数据){
this.mmsi=ko.可观察(data.mmsi);
this.lat=ko.可观测(数据纬度);
this.long=ko.可观测(数据经度);
this.trueheading=ko.可观测(data.trueheading);
}
函数VesselViewModel(){
//资料
var self=这个;
自船=新的可观测航道([]);
self.assoc={};
//操作
self.addVesser=功能(m、lt、lg、th){
自容器。推(新容器)({
m:,
拉特:上尉,
龙:lg,
真实标题:th
}));
};
self.removecasure=功能(容器){
自容器。移除(容器)
};
self.updatevssel=函数(键,项){
if(自关联[键]){
self.assoc[key].值(项)
}否则{
self.vessels.push(VesselViewModel.assoc[键]={
钥匙:钥匙,
价值:可观测(价值)
});
}
}

}
我真的认为您不需要创建关联数组。您可以通过各种类型的绑定直接访问敲除对象。这里有一个简单的解决方案,我花了大约10分钟才搞定

为了进行编辑,因为所有内容都是可观察的,所以只要在行中隐藏/显示表单字段就可以了。完成后,单击“完成”,所有内容都已更新

它至少会给你一个你能做什么的例子

var model;
var data = [{mmsi: '12', lat: '12', long: '12', trueheading: '12'},
  {mmsi: '13', lat: '13', long: '13', trueheading: '13'},
  {mmsi: '14', lat: '14', long: '14', trueheading: '14'},
  {mmsi: '15', lat: '15', long: '15', trueheading: '15'}];

var Vessel = function (datas) {
    var self = this;
  self.mmsi = ko.observable(datas.mmsi);
  self.lat = ko.observable(datas.lat);
  self.long = ko.observable(datas.long);
  self.trueheading = ko.observable(datas.trueheading);

  self.editing = ko.observable(datas.editing || false);

  self.editVessel = function() {
    self.editing(!self.editing());
  }
}

var viewModel = function (datas) {

  var self = this;

  self.vessels = ko.observableArray(ko.utils.arrayMap(datas, function(vesselItem){
    return new Vessel(vesselItem);
  }));


  self.addVessel = function () {
    var newVessel = {
        mmsi: '',
      lat: '',
      long: '',
      trueheading: '',
      editing: true
    };
    self.vessels.push(new Vessel(newVessel));
  }

  self.removeVessel = function (vessel) {
    self.vessels.remove(vessel);
  }


}

model = new viewModel(data);
ko.applyBindings(model);

这听起来像是一个问题:为什么您认为您需要带有该特定签名的
updatessel
,也就是说,为什么您需要
key
作为参数?什么是
.value()
函数?还要注意,您调用的是
VesselViewModel.assoc[key]
,它与
self.assoc[key]
不同。请更新您的问题,包括实际场景/任务/todo的(复制),可能还包括视图代码。谢谢!还有一种方法可以在javascript中修改这些值吗?假设我想更新mmsi=12的lat和long。我有数据={mmsi:'12',lat:'45',long:'56',trueheading:'12'};这是否有可能与击倒?我认为您最好的选择是再次加载数据并“替换”整个当前可观测阵列<代码>var数据是静态的,但我假设您将使用ajax或其他什么?无论哪种方式,您都不需要只更新mmsi:“12”,您可以替换整个船舶阵列。