使用Knockout映射插件在子数组的成员上定义计算的observable

时间:2013-03-24 19:19:43

标签: javascript mvvm knockout.js

我有以下内容:

// Child Array is Cards, trying to add computed observable for each child
var CardViewModel = function (data) {
    ko.mapping.fromJS(data, {}, this);
    this.editing = ko.observable(false); 
};

var mapping = {  
    'cards': {  // This never gets hit, UNLESS I remove the 'create' method below
        create: function (options) {
            debugger;
            return new CardViewModel(options.data);
        }
    },

    create: function(options) {
        var innerModel = ko.mapping.fromJS(options.data);
        innerModel.cardCount = ko.computed(function () {
            return innerModel.cards().length;
        });
        return innerModel;
    }
};

var SetViewModel = ko.mapping.fromJS(setData, mapping);
debugger;
ko.applyBindings(SetViewModel);

但是我不能让'cards'绑定工作 - 除非我删除'create'方法,否则不会达到代码。我试图效仿淘汰赛网站上的例子:

http://knockoutjs.com/documentation/plugins-mapping.html

他们为子对象定义执行此操作:

var mapping = {
    'children': {
        create: function(options) {
            return new myChildModel(options.data);
        }
    }
}
var viewModel = ko.mapping.fromJS(data, mapping);

使用如下定义的ChildModel:

var myChildModel = function(data) {
    ko.mapping.fromJS(data, {}, this);

    this.nameLength = ko.computed(function() {
        return this.name().length;
    }, this);
}

我过去一天都花在这上面,并且不能为我的生活弄清楚为什么这不起作用。任何提示都会很棒。

编辑:这是我正在使用的一个小提琴。它仅在结果中显示SIDE 1,因为此处无法识别“编辑”:

<div data-bind="visible: !$parent.editing()" class="span5 side-study-box">

http://jsfiddle.net/PTSkR/1/

这是我在运行Chrome时遇到的错误:

  

未捕获错误:无法解析绑定。消息:TypeError:Object    没有方法'编辑';绑定值:visible:!$ parent.editing()

2 个答案:

答案 0 :(得分:2)

您已覆盖视图模型的create行为。映射插件不会为您调用属性的任何其他处理程序。由于您是在create方法中进行映射,因此请移动cards处理程序。

var mapping = {  
    create: function(options) {
        var innerModel = ko.mapping.fromJS(options.data, {
            'cards': {
                create: function (options) {
                    debugger;
                    return new CardViewModel(options.data);
                }
            }
        });
        innerModel.cardCount = ko.computed(function () {
            return innerModel.cards().length;
        });
        return innerModel;
    }
};

updated fiddle

答案 1 :(得分:-1)

你不需要括号。我刚从

改变了
!$parent.editing() 

 to 


!$parent.editing

查看更新的小提琴here