Knockout.js 获取对象';从敲除JS中输入的值

Knockout.js 获取对象';从敲除JS中输入的值,knockout.js,Knockout.js,我需要从敲除生成的html中的对象获取值。我怎样才能做到这一点?我的基本代码结构如下 如果有更好的方法实现同样的目标,那我洗耳恭听 在我的JS代码中,我有: self.myObservable = ko.observable(); self.myObservableArray = ko.observableArray([Obj1, Obj2, Obj3]); self.someFunction = function () { //some ajax calls which gives me

我需要从敲除生成的html中的对象获取值。我怎样才能做到这一点?我的基本代码结构如下

如果有更好的方法实现同样的目标,那我洗耳恭听

在我的JS代码中,我有:

self.myObservable = ko.observable();
self.myObservableArray = ko.observableArray([Obj1, Obj2, Obj3]);
self.someFunction = function () {
  //some ajax calls which gives me an object back with a unique key 
  //so i add this to the observable.
  self.myObservable[uniqueKey] = results;
}
在我的html中,我有:


//这就是我需要从项目中获取值的地方。键是foreach中Obj的“name”
$parent.myObservable[key]。名称???

请记住,除非您使用类似的方法,否则始终需要通过将可观察对象作为函数调用来设置它们。您不能像JS代码示例那样只使用普通赋值,而不能同时自动更新视图

我认为您可能正在寻找一个可观察的字典,尽管您的示例代码有点太不准确了。在任何情况下,对于KnockoutJS。因此,您要么需要使用上述链接中的解决方案,要么需要重写应用程序以使用键值对的常规ObservalArray,如下所示:

self.myObservablePseudoDictionary = ko.observableArray([]);
self.myObservableArray = ko.observableArray([Obj1, Obj2, Obj3]);
self.someFunction = function () {
  self.myObservablePseudoDictionary.push({ key: uniqueKey, value: results });
}

我无法帮助您在视图中访问此项,因为您的伪代码没有告诉我
key
来自何处。这里有各种各样的选项,根据您的上下文,您必须选择/创建一个。这是留给读者的练习:)。

你的问题不是很清楚(如另一个答案所述…),但我是这样理解的(如果我错了,请纠正我):

  • 您希望保留一个可观察对象,该对象存储特定键的数据
  • 您希望有一个可观察数组,用于存储要为其渲染数据的关键帧
  • 一种方法动态地将键/值对添加到第一个可观察对象
  • 可观察数组可以接收新的键或删除键以更改可见的内容
下面是一个示例实现。我添加了一些注释来解释发生了什么。如果我完全误解了你的意图,请告诉我

函数VM(){
var self=这个;
//我已经用一个空对象初始化了这个observable,这样我们以后就可以添加键了
self.observestorage=ko.observeable({});
//您的问题中不清楚此数组中项目的数据类型,
//我假设您指的是对象的“引用”(字符串键)
self.observekeys=ko.observearray([“键1”、“键2”、“键3”);
self.getData=function(){
//这是您将从服务器接收的内容
var mockupServerData={
“键1”:“键1的数据”
};
//使用“()”将旧对象从可观察对象中取出
var originalStorage=self.observestorage();
//这将创建一个包含所有旧关键点的新对象,并添加新关键点
var newStorage=Object.assign({},originalStorage,mockupServerData);
//使用新对象设置observable会触发UI更新
自身可观察存储空间(新闻存储);
};
};
var vm=新vm();
ko.应用绑定(vm);
vm.getData()

如果要向用户显示已设置的选项:

<div data-bind="foreach: myObservableArray">
   <div data-bind="click: $parent.setItem.bind($data), text: name, css: { 'active' : ($parent.myObservable() != null && $parent.myObservable().name() == name())}"></div>
</div>


这将把活动类添加到selected items div.

您已经标记了2.0和3.0。如果你的问题非常具体,我建议只留下那一个。否则,我建议删除它们。嗨,真的很尴尬,但问题是我的HTML中缺少了括号。所以我调用的是$parent.observatestorage[$data],而不是$parent.observatestorage()[$data]!!!谢谢你的帖子,当我看到你的html时,我马上意识到了这一点
<div data-bind="text: $data.name"></div>
<div data-bind="foreach: myObservableArray">
   <div data-bind="click: $parent.setItem.bind($data), text: name, "></div>
</div>
self.setItem = function (item) {
  // Do what you want with it in here. ie. self.myObservable(item);
  self.myObservable(item);
}
<div data-bind="foreach: myObservableArray">
   <div data-bind="click: $parent.setItem.bind($data), text: name, css: { 'active' : ($parent.myObservable() != null && $parent.myObservable().name() == name())}"></div>
</div>