javascript - 如何让 knockout 扩展器在 observableArray 中工作

标签 javascript knockout.js ko.observablearray

我目前正在使用 Mathew Schinckel 的 KnockoutJS dirty 扩展器 http://schinckel.net/2012/01/14/knockoutjs-dirty-extender./在我当前的项目中。我无法让这个扩展器在 observableArray 中工作。我想知道是否有人能够看一下我在这里做错了什么。

ko.extenders.dirty = function (target, startDirty) {
    var cleanValue = ko.observable(ko.utils.unwrapObservable(target));
    var dirtyOverride = ko.observable(ko.utils.unwrapObservable(startDirty));

    target.isDirty = ko.computed(function () {
        return dirtyOverride() || ko.utils.unwrapObservable(target) !== cleanValue();
    });

    target.markClean = function () {
        cleanValue(ko.utils.unwrapObservable(target));
        dirtyOverride(false);
    };
    target.markDirty = function () {
        dirtyOverride(true);
    };
    target.reset = function () {
        target(cleanValue());
        dirtyOverride(false);
    };

    return target;
};

function miscellaneousItem(data) {
    this.MiscellaneousId = ko.observable(data.MiscellaneousId);
    this.Description = ko.observable(data.Description).extend({ required: "", dirty: false });
    this.showDeleteForm = ko.observable(false);
    this.editableDescription = ko.observable(false);
}

function miscellaneousViewModel(initialData) {
    var self = this;
    self.miscItems = ko.observableArray([]);

    self.init = function () {
        $.map(initialData, function (i, index) {
            var item = new miscellaneousItem(i);
            self.miscItems.push(new miscellaneousItem(item));
        });
    };

    // edit function item for miscItems within a foreach loop in the view
    self.editItem = function (item) {
        console.log(item.Description.isDirty());
    };
}

HTML View :

        <div class="form" data-bind="visible: showForm">
        <div class="control-group" data-bind="css: { error: description.hasError() }">
            <label class="control-label">Description</label>
            <div class="controls">
                <textarea class="span12" data-bind="koFocus: showForm, value: description, valueUpdate: 'afterkeydown'"></textarea>
            </div>
        </div>

        <button class="btn btn-primary" id="btnSave" data-loading-text="Saving..." data-bind="disable: description.hasError(), click: addItem">Save</button>
        <button class="btn" data-bind="click: toggleForm">Cancel</button>

        <hr class="sg" />
    </div>
    <ul class="media-list" data-bind="foreach: miscItems">
        <li class="media">
            <a class="pull-left" href="#">
                <img class="media-object" src="/Content/img/educationEntry.png" alt="" />
            </a>
            <div class="media-body">
                <div class="row-fluid">
                    <div class="span9">
                        <h4 data-bind="html: $data.Description(), visible: !editableDescription()"></h4>
                        <textarea class="span12" rows="3" data-bind="value: $data.Description(), visible: editableDescription(), valueUpdate: 'afterkeydown'"></textarea>
                        <div data-bind="visible: editableDescription()">
                            <p>
                                <button class="btn btn-primary" data-bind="click: $parent.editItem">Save</button>
                                <button class="btn" data-bind="click: $parent.cancelItem">Cancel</button>

                            </p>
                        </div>
                    </div>
                    <div class="span3">
                        <div class="pull-right">
                            <a href="#" class="btn btn-warning" title="Edit this entry" data-toggle="tooltip" data-bind="click: $parent.editItem"><i class="icon-edit"></i></a>
                            <a href="#" class="btn btn-danger" title="Delete this entry" data-toggle="tooltip" data-bind="click: $parent.removeItem"><i class="icon-trash"></i></a>
                        </div>
                    </div>
                </div>
                <div data-bind="visible: showDeleteForm">
                    <hr class="sg" />
                    <p>Are you sure you would like to delete this Miscellaneous item?</p>
                    <p><small class="quaternaryColorText"><em>* This can not be undone.</em></small></p>

                    <button class="btn btn-primary" data-bind="click: $parent.deleteItem"><i class="icon-trash"></i> Yes</button>
                    <button class="btn" data-bind="click: $parent.cancelDeleteItem">No</button>
                </div>
            </div>
        </li>
    </ul>

希望有人处理过与此问题类似的问题。感谢您的时间和回复。

最佳答案

我能够回答我自己的问题。我意识到我在 javascript 代码中所做的事情是错误的,并且我没有在 HTML 中使用双向绑定(bind)。为了使用双向绑定(bind),在设置数据绑定(bind)属性时不得使用“()”。

希望这可以帮助其他和我有同样困难的人。

最诚挚的问候

关于javascript - 如何让 knockout 扩展器在 observableArray 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22816454/

相关文章:

javascript - 如何使用 Knockout 更改 JS(TS) 中选择组件的值?

javascript - 是否可以记录 KO 可观察数组?

javascript - AngularJS/javascript 将两个长度相同的数组组合在一起

javascript - 如何使用数据绑定(bind) Knockout.js 枚举 javascript 对象的属性

javascript - 更改 jQuery 中当前元素的背景

css - 数据绑定(bind)循环 knockout js,如果我想一次只显示列表中的 2 个名称,然后单击接下来的 2 个名称的按钮

javascript - knockout.js 和 observableArray 在第二次点击时不更新 DOM

javascript - 将不同的 json 数据映射到可观察数组

javascript - 如何使用 javascript 显示来自 parse.com 数据库的图像?

javascript - Promise 返回 'undefined' 或 babel 编译的代码不等待返回(async/await)