Javascript 使用敲除映射插件定义子数组成员上的计算可观测值

Javascript 使用敲除映射插件定义子数组成员上的计算可观测值,javascript,mvvm,knockout.js,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 nev

我有以下资料:

// 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”方法,否则无法访问该代码。我试着按照淘汰网站上的例子:

它们对子对象定义执行以下操作:

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);
}
我已经在这上面花了一天的时间,我一辈子都不明白为什么这不起作用。任何提示都会很棒

编辑:这是我正在处理的一些问题。它只在结果中显示第1面,因为此处无法识别“编辑”:

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

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

未捕获错误:无法分析绑定。消息:TypeError:Object 没有“编辑”方法;绑定值:可见:$parent.editing()


你不需要括号。我刚从

!$parent.editing() 

 to 


!$parent.editing

查看更新的小提琴

您不需要括号。我刚从

!$parent.editing() 

 to 


!$parent.editing

请参见更新的FIDLE

您已覆盖视图模型的
创建
行为。映射插件不会为您调用属性的任何其他处理程序。因为您是从
create
方法中映射的,所以将
处理程序移动到该方法中

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

您已覆盖视图模型的
创建
行为。映射插件不会为您调用属性的任何其他处理程序。因为您是从
create
方法中映射的,所以将
处理程序移动到该方法中

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

你能把小提琴放好让我们轻松吗?刚刚加了一把,谢谢阿什你能把小提琴放好让我们轻松吗?刚刚加了一把,谢谢阿什哇,谢谢杰夫。这是一个简单的解决方案。如果您不介意的话,还有一个问题-对于cardCount方法,我应该使用innerModel.cards()还是使用this.cards()?您将无法使用
this
,因为您没有将
innerModel
作为第二个参数传递。如果你这样做了,那么你可以使用
这个
。哇,谢谢杰夫。这是一个简单的解决方案。如果您不介意的话,还有一个问题-对于cardCount方法,我应该使用innerModel.cards()还是使用this.cards()?您将无法使用
this
,因为您没有将
innerModel
作为第二个参数传递。如果您这样做了,那么您可以使用
。进行更改是错误的。从未创建可观察的
编辑
,因此尝试从中获取值(通过调用它)失败。您建议的更改将逻辑从“未编辑卡片时可见”更改为“未定义编辑可观察对象时可见”,这是不正确的。@您是否同意。谢谢你的解释。击倒就是击倒我。。。再次感谢您的帮助,如果
不在那里。如果表达式只是返回一个可观察值,那么knockout将自动打开该值。进行这种更改是错误的。从未创建可观察的
编辑
,因此尝试从中获取值(通过调用它)失败。您建议的更改将逻辑从“未编辑卡片时可见”更改为“未定义编辑可观察对象时可见”,这是不正确的。@您是否同意。谢谢你的解释。击倒就是击倒我。。。再次感谢您的帮助,如果
不在那里。如果表达式只是返回一个可观察值,那么knockout将自动打开该值。