如何拼接ko.computeds

时间:2016-06-27 05:12:29

标签: javascript jquery knockout.js drag-and-drop

我有两个ko.computeds列表,我想拖放,但也用按钮移动删除添加到列表。

但是我不能使它们同时使用dragndrop和按钮功能。

对于拖放我使用Ryan Niemeyers优秀的可排序库。

我想我需要让我的计算机可写,但这是我卡住的地方,似乎无法摆脱错误“拼接不是计算机的函数”。

因此,通过拖放进行排序失败。

这是其中一台电脑:

         this.availableTexts = ko.computed({
            read: function(){
               return ko.utils.arrayFilter(self.texts(), function(text) {
               return text.sceneID() === null;
            })
          },
          write: function(value){
            return value;
          },
          owner: this
        });

完全小提琴:http://jsfiddle.net/AsleG/yLvrp7zz/

2 个答案:

答案 0 :(得分:1)

Niemeyer的可淘汰排序库可与splice 内部配合使用,以对项目数组(source)进行排序。我相信它不会对计算机有效,即使它返回一个数组并且具有正确的写入方法......

我建议使用visible绑定来隐藏单个项目。您必须公开projectID或映射您的项目以包含如下计算:

var projectID = 1;
self.allScenes = ko.observableArray(scenes.map(function(scene) {
  return Object.assign({}, scene, {
    isVisible: ko.computed(function() { 
      return scene.projectID === projectID;
  });
});

或者,在viewmodel中:

self.projectId = 1;
HTML中的

<li data-bind="visible: projectID === $parent.projectId"> ... </li>

答案 1 :(得分:1)

请参阅:https://stackoverflow.com/a/16464935/4024558

您可以使用observableArray.filter代替computed

突然间,我无法分叉你的小提琴。所以你可以用这个http://pastebin.com/jjNQ39nJ替换你的js,它会起作用。