我要做的是从其他更大的可用项目列表中建立一个项目列表(对于上下文,请考虑指定某种类型产品的成分)。当谈到 Knockout 时,我仍然很年轻,我想知道我是否遗漏了什么,因为我目前使用的解决方案感觉不对。我有几个非常标准的模板,并且正在对我的视图模型上的两个可观察数组使用 foreach 绑定(一个用于可用成分列表,一个用于产品的选定成分列表)。
<div data-bind="template: {name:'ingredientTypeTemplate', foreach: ingredientTypes}"></div>
<div data-bind="template: {name:'selectedIngredientTypeTemplate', foreach: selectedIngredientTypes}"></div>
<script>
var productTypeViewModel = {
ingredientTypes: ko.observableArray([]),
selectedIngredientTypes: ko.observableArray([]),
addIngredient: function () {
productTypeViewModel.ingredientTypes.remove(this);
productTypeViewModel.selectedIngredientTypes.push(this);
},
removeIngredient: function () {
productTypeViewModel.selectedIngredientTypes.remove(this);
productTypeViewModel.ingredientTypes.push(this);
},
};
$(document).ready(function () {
$.getJSON("/IngredientType/Index")
.success(function (data) {
productTypeViewModel.ingredientTypes($.parseJSON(data));
})
.error(function () { alert("error"); });
ko.applyBindings(productTypeViewModel);
});
</script>
<script type="text/x-jquery-tmpl" id="ingredientTypeTemplate">
<div>
<span>${Name}</span>
<a href='#' data-bind="click: productTypeViewModel.addIngredient">Add</a>
</div>
</script>
这是做我想用 Knockout 做的最好的方法吗?感觉有些不对劲,虽然我不太确定是什么。我确实有一个单独的 VM 定义,它有一个 add 函数。可观察的成分类型将使用该类型的一组 VM 进行初始化,然后模板仅在其上使用 data-bind“click: add”,但我不喜欢从这个虚拟机与主 VM 通信处理点击。
基本上,我只想说明我所做的是标准方法还是有更好(更适合淘汰赛)的方法来做到这一点。