淘汰排序与计算观察不工作
knockout sortable with computed observable not working
jsfield示例。就像标题所说的,我试图使用一个可计算的可观察对象以及一个可排序的例子。我一直得到
写方法需要实现
在开发者控制台中可以看到这个错误。
我有一个写方法实现在我的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());
正如这个插件的作者在这里所说,你不能使用计算的可观察对象;可排序插件依赖于一个实际的可观察数组。
当你考虑它时,这是有意义的:插件实际上是在你重新排序元素时操纵数组的各种索引。
如果你想要两者兼得,这里有一个" writablecomputearray "。如果你从数组中添加/删除,并且随后对可观察对象的重新计算执行相同的添加/删除,订阅者将不会第二次得到通知。但是,您有责任确保数组的计算与实际添加/删除的内容之间没有差异。您可以通过在可排序绑定的afterMove事件中进行必要的更改来实现这一点。
ko.writeableComputedArray = function (evaluatorFunction) {
// We use this to get notified when the evaluator function recalculates the array.
var computed = ko.computed(evaluatorFunction);
// This is what gets returned to the caller and they can subscribe to
var observableArray = ko.observableArray(computed());
// When the computed changes, make the same changes to the observable array.
computed.subscribe(function (newArray) {
// Add any new values
newArray.forEach(function (value) {
var i = observableArray.indexOf(value);
if (i == -1) {
// It's a new value, push it
observableArray.unshift(value);
}
});
// Remove any old ones. Loop backwards since we're removing items from it.
for (var valueIndex = observableArray().length - 1; valueIndex >= 0; valueIndex--) {
var value = observableArray()[valueIndex];
var i = newArray.indexOf(value);
if (i == -1) {
// It's an old value, remove it
observableArray.remove(value);
}
}
});
return observableArray;
};
相关文章:
- Javascript:selenium Web驱动程序isDisplayed()不工作
- jQuery UI自动完成突然停止工作
- knockoutjs可观察数组
- AngularJS UI路由器不能像ng路由器那样工作
- HTML5音频加载和播放获胜'我不能在iPad上工作
- JavaScript打印功能使日历停止工作
- Javascript.getHours()工作不正常
- 为什么这在IE中的工作方式与在Firefox中不同
- firefox插件:退出不工作的应用程序观察器
- 如何让Knockout可观察数组与jQuery对话框一起工作
- Web Storm 9.0.3 typescript文件观察程序不工作
- Knockout.js多个可观察数组不工作
- Ember.js被摧毁的观察者不工作
- 挖空解包可观察对象无法按预期工作
- 可观察到淘汰赛不工作
- 使用AngularJS观察下拉菜单's选择的项目不工作
- AngularJS观察-无法在chrome中使用devtools工作区设置断点
- 可观察对象的订阅函数不能正常工作
- 聚合物是如何观察js工作的
- 淘汰排序与计算观察不工作