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

时间:2014-04-02 15:39:09

标签: javascript knockout.js ko.observablearray

我目前正在使用Mathew Schinckel的KnockoutJS脏扩展器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视图:

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

希望有人处理类似这个问题的事情。感谢您的时间和回应。

1 个答案:

答案 0 :(得分:0)

我能够回答我自己的问题。我意识到我在javascript代码中所做的事情是错误的,我没有在HTML中使用双向绑定。要使用双向绑定,您不能使用&#34;()&#34;设置数据绑定属性时。

希望这可以帮助那些遇到与我同样困难的人。

最好的问候