gpt4 book ai didi

javascript - 如何将对象推送到 observableArray

转载 作者:行者123 更新时间:2023-12-03 08:26:46 28 4
gpt4 key购买 nike

我有这个模型,一个Foo有很多FooItem。如何向 FooItem 添加对象?

我有这段代码,您可以建议甚至删除最适合此场景的整个代码

var Foo = function (selected) {
this.id = ko.observable();
this.name = ko.observable();
this.fooItems = ko.observableArray([]);
this.isSelected = ko.computed(function() {
return selected() === this;
}, this);
};

var FooItem = function () {
this.id = ko.observable();
this.selectedItemId = ko.observable();
this.selectedName = ko.observable();
this.remarks = ko.observable();
};

var foosFromDb = [{ id: 1, name: 'foo1' },
{ id: 2, name: 'foo2' },
{ id: 3, name: 'foo3' },
{ id: 4, name: 'foo4' }];

var fooItemsFromDb = [
{ id: 1, fooItem: 'fooItem1' },
{ id: 2, fooItem: 'fooItem2' },
{ id: 3, fooItem: 'fooItem3' },
{ id: 4, fooItem: 'fooItem4' },
{ id: 5, fooItem: 'fooItem5' },
];

var vm = (function () {
var
foos = ko.observableArray([]),
fooItemsList = ko.observableArray([]),
loadFoos = function() {
for(var i = 0; i < foosFromDb.length; i++) {
foos.push(new Foo(selectedFoo)
.id(foosFromDb[i].id)
.name(foosFromDb[i].name));
}

selectFoo(foos()[0]);
},
loadFooItemsList = function() {
for(var i = 0; i < fooItemsFromDb.length; i++) {
fooItemsList.push({ id: fooItemsFromDb[i].id, name: fooItemsFromDb[i].fooItem });
}
},
selectedFoo = ko.observable(),
selectFoo = function(item) {
selectedFoo(item);
},
newFoo = function(item) {
var id = foos().length + 1;
var aFoo = new Foo(selectedFoo)
.id(id)
.name('');

foos.push(aFoo);
selectFoo(aFoo);
},
addFooItem = function(item){
console.log(item); // In here I think I am getting the Selected Foo.
};

return {
foos: foos,
loadFoos: loadFoos,
newFoo: newFoo,
selectedFoo: selectedFoo,
selectFoo: selectFoo,
loadFooItemsList: loadFooItemsList,
fooItemsList: fooItemsList,
addFooItem: addFooItem
};
}());

vm.loadFoos();
vm.loadFooItemsList();
ko.applyBindings(vm);
.container {
float: left;
width: 200px;
height: 250px;
border: 1px solid #ccc;
}
.selected {
background-color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div class="container">
<a href="#" data-bind="click: newFoo">New Foo</a>
<table>
<tr>
<th>Foo Id</th>
<th>Foo Name</th>
</tr>
<tbody data-bind="foreach: foos" style="cursor: pointer">
<tr data-bind="click: $root.selectFoo, css: { selected: isSelected }">
<td data-bind="text: id"></td>
<td data-bind="text: name"></td>
</tr>
</tbody>
</table>
</div>
<div data-bind="with: selectedFoo">
<div class="container">
<label>Id</label><br /><input type="text" data-bind="value: id" /><br />
<label>Name</label><br /><input type="text" data-bind="value: name" /><br />
</div>
<div class="container">
<label>Foo Item</label><br /><select data-bind="options: $root.fooItemsList,
optionsText: 'name',
optionsValue: 'id'"></select><br />
<label>Remarks</label><br /><input type="text" /><br />
<a href="#" data-bind="click: $root.addFooItem">Add Foo Item</a>
</div>
<div class="container">
<table>
<thead>
<tr>
<th>FooItem</th>
<th>Remarks</th>
</tr>
</thead>
</table>
</div>
</div>
<div style="clear: both"></div>
<pre data-bind="text: ko.toJSON($root.selectedFoo, null, 2)"></pre>

当我点击添加Foo Item时,我希望填充字段中输入内容的表格(最右侧),并填充FoofooItems 属性。

我有这个fiddle供引用

欢迎提出建议、提示或任何编码实践。任何帮助将非常感激。谢谢

编辑我最终发布了整个 View 模型。哪个是错误的

最佳答案

您缺少一些连接所有东西所必需的东西。您的 select 没有绑定(bind)到任何东西,并且您没有可以绑定(bind)到的可观察对象。为此,我向 Foo 添加了一个 selectedItem 成员。

我将选择的 optionsValue 恢复为正在选择的项目,因为我不想查找它。该值不是 FooItem,而是一个带有 id 和 name 的简单对象。在 addFooItem 中,我从对象数据创建一个新的 FooItem 并将其推送到 fooItems 列表中。

表格主体未定义,因此我将其设置为显示。由于某种原因,保存备注会导致所有以前保存的备注更新。我不知道为什么,但我发现整个结构有点难以理解。

var Foo = function(selected) {
this.id = ko.observable();
this.name = ko.observable();
this.fooItems = ko.observableArray([]);
this.isSelected = ko.computed(function() {
return selected() === this;
}, this);
this.selectedItem = ko.observable('quack');
};

var FooItem = function() {
this.id = ko.observable();
this.selectedItemId = ko.observable();
this.selectedName = ko.observable();
this.remarks = ko.observable();
};

var foosFromDb = [{
id: 1,
name: 'foo1'
}, {
id: 2,
name: 'foo2'
}, {
id: 3,
name: 'foo3'
}, {
id: 4,
name: 'foo4'
}];

var fooItemsFromDb = [{
id: 1,
fooItem: 'fooItem1'
}, {
id: 2,
fooItem: 'fooItem2'
}, {
id: 3,
fooItem: 'fooItem3'
}, {
id: 4,
fooItem: 'fooItem4'
}, {
id: 5,
fooItem: 'fooItem5'
}, ];

var vm = (function() {
var
foos = ko.observableArray([]),
fooItemsList = ko.observableArray([]),
loadFoos = function() {
for (var i = 0; i < foosFromDb.length; i++) {
foos.push(new Foo(selectedFoo)
.id(foosFromDb[i].id)
.name(foosFromDb[i].name));
}

selectFoo(foos()[0]);
},
loadFooItemsList = function() {
for (var i = 0; i < fooItemsFromDb.length; i++) {
fooItemsList.push({
id: fooItemsFromDb[i].id,
name: fooItemsFromDb[i].fooItem
});
}
},
selectedFoo = ko.observable(),
selectFoo = function(item) {
selectedFoo(item);
},
newFoo = function(item) {
var id = foos().length + 1;
var aFoo = new Foo(selectedFoo)
.id(id)
.name('');

foos.push(aFoo);
selectFoo(aFoo);
},
addFooItem = function(foo) {
var itemData = foo.selectedItem(),
item = new FooItem();
item.id(itemData.id);
item.selectedName(itemData.name);
var r = vm.remark();
console.debug("Remark:", r);
item.remarks(r);
foo.fooItems.push(item);
};

return {
foos: foos,
loadFoos: loadFoos,
newFoo: newFoo,
selectedFoo: selectedFoo,
selectFoo: selectFoo,
loadFooItemsList: loadFooItemsList,
fooItemsList: fooItemsList,
remark: ko.observable(),
addFooItem: addFooItem
};
}());

vm.loadFoos();
vm.loadFooItemsList();
ko.applyBindings(vm);
.container {
float: left;
width: 200px;
height: 250px;
border: 1px solid #ccc;
}
.selected {
background-color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div class="container">
<a href="#" data-bind="click: newFoo">New Foo</a>
<table>
<tr>
<th>Foo Id</th>
<th>Foo Name</th>
</tr>
<tbody data-bind="foreach: foos" style="cursor: pointer">
<tr data-bind="click: $root.selectFoo, css: { selected: isSelected }">
<td data-bind="text: id"></td>
<td data-bind="text: name"></td>
</tr>
</tbody>
</table>
</div>
<div data-bind="with: selectedFoo">
<div class="container">
<label>Id</label>
<br />
<input type="text" data-bind="value: id" />
<br />
<label>Name</label>
<br />
<input type="text" data-bind="value: name" />
<br />
</div>
<div class="container">
<label>Foo Item</label>
<br />
<select data-bind="options: $root.fooItemsList,
optionsText: 'name',
value: selectedItem"></select>
<br />
<label>Remarks</label>
<br />
<input type="text" data-bind="value: $root.remark" />
<br />
<a href="#" data-bind="click: $root.addFooItem">Add Foo Item</a>
</div>
<div class="container">
<table>
<thead>
<tr>
<th>FooItem</th>
<th>Remarks</th>
</tr>
</thead>
<tbody data-bind="foreach: fooItems">
<td data-bind="text:selectedName"></td>
<td data-bind="text:$root.remark"></td>
</tbody>
</table>
</div>
</div>
<div style="clear: both"></div>
<pre data-bind="text: ko.toJSON($root.selectedFoo, null, 2)"></pre>

关于javascript - 如何将对象推送到 observableArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33518437/

28 4 0
文章推荐: javascript - TypeScript 在 JavaScript 函数中为 this.varName 分配类型
文章推荐: javascript - 如何包含多个组件,然后可能从一个组件调用到另一个组件?
文章推荐: javascript - 循环遍历对象并映射到 JavaScript 中的值
文章推荐: javascript - 如何将
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com