javascript - 可使用计算的可观察对象进行排序的 knockout 不起作用

标签 javascript jquery jquery-ui knockout.js knockout-sortable

jsfiddle example .就像标题所说的那样,我正在尝试使用计算可观察值以及 rniemeyer knockout 可排序示例。我不断得到

the write method needs to be implemented

此错误可在开发者控制台中查看。

我在 ko.computed 上实现了一个写入方法,但它仍然出错。我做错了什么?

下面是 html 和 javascript

<div id="main">
    <h3>Tasks</h3>
    <div class="container" data-bind="sortable: tasks">
        <div class="item">
            <span data-bind="visible: !$root.isTaskSelected($data)">
                <a href="#" data-bind="text: TestName"></a>
            </span>
            <span data-bind="visibleAndSelect: $root.isTaskSelected($data)">
                <input data-bind="value: name, event: { blur: $root.clearTask }" />
            </span>  
        </div>
    </div>
</div>

var Task = function(first,last) {
    var self = this;
    self.firstName = ko.observable(first);
    self.lastName = ko.observable(last);
    self.TestName = ko.computed({
        read: function (){
            return self.firstName() + " " +  self.lastName();
        },
        write: function (item) {
            console.log(item);
        }
    });

    return self;
}

var ViewModel = function() {
    var self = this;
    self.testTasks = ko.observableArray([
        new Task("test","one"),
        new Task("test","two"),
        new Task("test","three")
         ]);

    self.tasks = ko.computed({
        read: function() { return self.testTasks();},
        write: function(item) {console.log(item);}
    }); 



    self.selectedTask = ko.observable();
    self.clearTask = function(data, event) {
        if (data === self.selectedTask()) {
            self.selectedTask(null);                
        }

        if (data.name() === "") {
           self.tasks.remove(data);   
        }
    };
    self.addTask = function() {
        var task = new Task("new");
        self.selectedTask(task);
        self.tasks.push(task);
    };

    self.isTaskSelected = function(task) {
       return task === self.selectedTask();  
    };
};

//control visibility, give element focus, and select the contents (in order)
ko.bindingHandlers.visibleAndSelect = {
    update: function(element, valueAccessor) {
        ko.bindingHandlers.visible.update(element, valueAccessor);
        if (valueAccessor()) {
            setTimeout(function() {
                $(element).find("input").focus().select();
            }, 0); //new tasks are not in DOM yet
        }
    }
};

ko.applyBindings(new ViewModel());

最佳答案

正如这个插件的作者所说 here ,您不能使用计算的可观察对象;可排序插件依赖于一个实际的可观察数组。

当您考虑时,这是有道理的:插件实际上是在您对元素重新排序时操纵数组的各种索引。

关于javascript - 可使用计算的可观察对象进行排序的 knockout 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22491085/

相关文章:

php - 为老式文件上传添加不显眼的进度条

javascript - 手动更改 aria-expanded ="true"不打开新选项卡

javascript - Angularjs:在 ng-repeat 中加载后运行 jquery

jQuery UI 可选择禁用

javascript - 为什么我的 three.js 光照不工作?

javascript - 我怎样才能随机搜索正则表达式javascript?

javascript - 重大事件后带走 child

javascript - 如何使用 jquery 编写条件语句来验证页面 url 或电子邮件?

javascript - 如何突出显示具有渐变背景而不是颜色背景的任何 div

jquery - 是否可以将字符串传递给jquery中的dialog()