1

我有以下内容:

// 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);

但是,我无法使“卡片”绑定起作用-除非我删除“创建”方法,否则无法到达该代码。我正在尝试按照淘汰赛网站上的示例进行操作:

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:对象没有方法“编辑”;绑定值:可见:!$parent.editing()

4

2 回答 2

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;
    }
};

更新的小提琴

于 2013-03-24T19:36:09.653 回答
-1

你不需要有括号。我刚从

!$parent.editing() 

 to 


!$parent.editing

在此处查看更新的小提琴

于 2013-03-24T19:34:47.523 回答