淘汰赛的JavaScript绑定的foreach(knockout javascript forea

2019-09-16 11:05发布

我试图让用户创建一个铸件,并添加类的数组此铸造对象。 我试图用基因敲除的的foreach结合类别的阵列,并允许用户添加新的类别来铸造。 我创建了一个的jsfiddle来说明什么,我想在这里解释。
http://jsfiddle.net/msell/ueNg7/16/

JSON对象获取正确的用户修改铸造建起来了,但我不能完全得到铸件的列表中显示。

Answer 1:

你有几个问题:

您正在使用1.2.1淘汰赛

所述foreach结合被未加入,直至淘汰赛2.0。

您使用的不是observableArray

您需要修改您的categories属性是ko.observableArray()而不只是一个空数组。 否则淘汰赛将不能够当你观察push给它,并remove方法将不存在。

this结合是错误的。

当从事件处理程序调用, this将设置不正确。 您可以通过多种方式,解决这个问题在淘汰赛文档中详细讨论 ,但一个简单的解决方法是改变引用viewModel ,而不是到this


要解决所有这些,你应该升级到淘汰赛2.0,并更改您的视图模型声明是

var viewModel = {
    name: ko.observable(''),
    description: ko.observable(''),
    categories: ko.observableArray(),
    categoryToAdd: ko.observable(''),

    removeCategory: function(category) {
        viewModel.categories.remove(category);
    },

    addCategory: function() {
        viewModel.categories.push(new Category(viewModel.categoryToAdd()));
        viewModel.categoryToAdd('');
    }
};

这里是一个修正的jsfiddle: http://jsfiddle.net/ueNg7/19/



Answer 2:

您需要使用ko.observableArray你数组当你改变你的阵列,并不会更新,否则淘汰赛不会知道,也应该使用模板来代替,读到这里http://knockoutjs.com/documentation/template-binding.html#note_2_using_the_foreach_option_with_a_named_template

var viewModel = {
    name: ko.observable(''),
    description: ko.observable(''),
    categories: ko.observableArray([]),
    categoryToAdd: ko.observable(''),
    removeCategory: function(category) {
        this.categories.remove(category);
    },

    addCategory: function() {

        this.categories.push(new Category(this.categoryToAdd()));
        this.categoryToAdd('');
    }
};


文章来源: knockout javascript foreach binding