Knockout计算属性未在第二次迭代中定义

时间:2014-09-25 06:46:59

标签: knockout.js knockout-sortable

我在 CategoryModel 的集合中获得了一个可排序的枚举(可拖动的插件,扩展了foreach),该集合具有 CanCategoryBeDeleted 计算方法。此功能用于启用或不启用按钮。 对于集合中的第一个项目,它可以正常工作,但对于第二个项目,它会因以下错误而失败。集合中的所有CategoryModel都很好看。使用启用标记可以按预期呈现集合。

  

未捕获的ReferenceError:无法处理绑定" sortable:function   (){return {data:categories,afterMove:$ root.orderCategories}}"   消息:无法处理绑定"启用:function(){return   CanCategoryBeDeleted}"消息:未定义CanCategoryBeDeleted

标记是:

<div data-bind="sortable: { data: categories, afterMove: $root.orderCategories }">
    <div class="mb20">
        <div class="well well-sm moveCursor">
            <div class="fl">
                <span data-bind="visible: !$root.isCategorySelected($data)">
                    <a href="#" title="Edit name" data-bind="text: Name, click: $root.selectedCategory"></a>
                </span>
                <span data-bind="visibleAndSelect: $root.isCategorySelected($data)">
                    <input data-bind="value: Name, event: { blur: $root.clearCategory }" class="form-control" />
                </span>
            </div>
            <div class="fr">
                <button class="btn btn-xs btn-danger" data-bind="click: $root.deleteCategory, enable: CanCategoryBeDeleted">Delete category</button>
            </div>
            <div class="clear"></div>
        </div>
        forum stuff here...
    </div>
</div>

模型是这样的:

function CategoryModel(data) {
    var self = this;
    self.Id = ko.observable(data.Id);
    self.Created = ko.observable(data.Created);
    self.IsPersisted = ko.observable(data.IsPersisted);
    self.Name = ko.observable(data.Name);
    self.Order = ko.observable(data.Order);
    self.Forums = ko.observableArray(data.Forums);

    self.CanCategoryBeDeleted = ko.computed(function () {
        console.log("CanCategoryBeDeleted...");
        if (self.Forums().length == 0) {
            console.log("should enable");
            return true;
        }
        console.log("should not enable");
        return false;
    }, self);
}

有谁知道我做错了什么?

1 个答案:

答案 0 :(得分:0)

是我的一个人;我在枚举简单的js对象,而不是类别模型。一旦我将js对象转换为等效的模型,它就会起作用。