- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑
显然逻辑是正确的。我怀疑问题在于我如何从 API 的 JSON 响应绑定(bind) View 模型。我添加了更多代码来尝试帮助诊断问题。
我是否正确绑定(bind)了 View 模型?
原帖
我不是问如何在 observableArray 中移动项目,我的代码是从这里在数组内上下移动项目: How do I swap two items in an observableArray?
晋升@Michael Best:https://stackoverflow.com/a/10630319/1888402
由@Moes向下移动:https://stackoverflow.com/a/26726556/1888402
我遇到的问题是将项目向下移动。上升得很好,问题似乎出在逻辑上。
JSON 模型
{
"Options": {
"SelectedHeader": "Left Header",
"AvailableHeader": "Right Header"
},
"Selected": [
{
"Order": 2,
"ID": 1,
"Label": "Duration"
},
{
"Order": 11,
"ID": 5,
"Label": "Metres / Min"
},
{
"Order": 23,
"ID": 7,
"Label": "Sprint Dis/Min"
},
{
"Order": 9,
"ID": 15,
"Label": "Max Velocity"
},
{
"Order": 6,
"ID": 16,
"Label": "Hi Intensity Running"
}
],
"Available": [
{
"ID": 123,
"Label": "I'm Available"
}
],
"WebServiceMethodUrl": "../../../Services/SomeAsmxService.asmx/SaveStuff"
}
查看模型
function ViewModel(){
var self = this;
self.Options = model.Options
self.Available = ko.observableArray(model.Available);
self.Selected = ko.observableArray(model.Selected);
self.WebServiceMethodUrl = model.WebServiceMethodUrl;
self.addSelected = function(item){
item.Order = self.Selected().length;
self.Available.remove(item);
self.Selected.push(item);
};
self.removeSelected = function(item){
self.Available.push(item);
self.Selected.remove(item);
};
self.moveUp = function(item) {
var i = self.Selected.indexOf(item);
if (i >= 1) {
var array = self.Selected();
self.Selected().splice(i-1, 2, array[i], array[i-1]); //Works fine
item.Order = i;
}
};
self.moveDown = function(item) {
var i = self.Selected.indexOf(item);
if (i < self.Selected().length - 1) {
var array = self.Selected();
self.Selected().splice(i, 2, array[i + 1], array[i]);
item.Order = i;
self.Selected.valueHasMutated(); //Force rebind
}
};
self.SaveIt = function(){
postDataAsync(self.WebServiceMethodUrl, "{queryString: '"+ ko.toJSON(self) + "'}", "Could not save settings.", function (resp){});
}
self.sortedSelected = ko.computed(function(){
return self.Selected().sort(function(left, right) { return left.Order == right.Order ? 0 : (left.Order < right.Order ? -1 : 1) });
});
}
var vm = new ViewModel();
ko.applyBindings(ViewModel);
HTML 和绑定(bind)
<!-- ko if: sortedSelected().length -->
<tbody data-bind="with:sortedSelected">
<!-- ko foreach: Selected -->
<!-- ko ifnot: (ID == 0) -->
<tr>
<td class="order">
<p data-bind="click: moveUp, clickBubble: false"><i class="fa fa-arrow-up"></i></p>
<p data-bind="text: $index() + 1"></p>
<p data-bind="click: moveDown, clickBubble: false"><i class="fa fa-arrow-down move-down"></i></p>
</td>
<td data-bind="text:Label, attr: { id: ID }"></td>
<td><a class="remove" data-bind="click: removeSelected, clickBubble: false">Remove <i class="fa fa-arrow-circle-o-right"></i></a></td>
</tr>
<!-- /ko-->
<!-- /ko-->
</tbody>
<!-- /ko -->
因此,如果我要对第 5 项调用 moveDown 函数,那么它应该变成第 6 项,而第 6 项应该变成第 5 项。不知道为什么这不起作用,因为这只是逻辑被颠倒了。
示例
最佳答案
问题在于您的 sortedSeleted
计算。任何时候 Selected
被修改时,计算值都会被重新计算,因为它依赖于 Selected
。当计算结果被评估时,它会对 Selected
进行排序。您可能没有意识到 sort
会修改它所调用的数组,同时也会返回该数组。这种按 Order
排序导致 moveUp
和 moveDown
函数显得不一致。
您很可能想要对Selected
的副本进行排序。正如 @RoyJ 指出的,您可以使用 slice
来获取数组的浅拷贝。
关于javascript - 在 ko.observableArray 模型绑定(bind)问题中向下移动项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33018440/
我有 2 个 observablearray。 当我将项目从 observablearray1 复制到 observablearray2 并更改 observablearray2 中的值时,obser
我正在使用这个名为 Dragula 的插件,它需要一个 ObservableArray 作为数据源。 HTML/Knockout 绑定(bind)
我是 JS 和 Knockout 的新手。我想将 observableArray 中的特定 observable 复制到另一个 observableArray。我怎样才能做到这一点? HTML
我在使用 Knockout.js 过滤可观察数组时遇到问题 我的js: 包含数据的数组 var docListData = [ { name: "Article Name 1", info:
我有这个模型,一个Foo有很多FooItem。如何向 FooItem 添加对象? 我有这段代码,您可以建议甚至删除最适合此场景的整个代码 var Foo = function (selected) {
我有以下 View 模型: function instance(id, FirstName){ $.extend(this, { id: ko.observable(id ||
我有这段代码,我希望渲染从 REST 查询的菜单: var PageViewModel = function() { var self = this; //
我发现这个问题与我的类似 - Replace all elements in Knockout.js observableArray 我还有另一个问题 - 如果我用新内容替换 observableAr
我正在尝试使用 knockoutJS 填充级联 select2 下拉列表。当使用静态数据时,代码似乎工作正常,如 function staticbuildData() 中所示。 ,但在使用函数 fun
knockoutjs 新手,我正在遵循有关加载和保存数据的教程,但我遇到了一些麻烦。当我将对象推送到数组时,该数组为空。我也在使用表格。这是我的代码, function Quiz(data) {
我正在开发一个项目,其中有一个搜索字段,可以根据搜索框中输入的内容过滤 observableArray。 这是我的 html 代码: 这是我的js代码: var Bu
我在客户端开发环境中工作,必须遵守他们的编码标准。我有以下 JS 和 HTML。我的 observableArray 未定义。我无法让它工作。甚至 console.logs 也打印了正确的值。 请不要
我有一个动态数据对象,因为它是从 WebApi 加载数据调用中读取的......然后使用以下方法将其转换为可观察对象: $.get("/api/PlateTemplate/Get", { id: s
我想为可观察数组中的元素设置动画。 我不会在 observableArray 中添加或删除项目。 考虑到以下 jsfiddle,我想调用 animateFirstElement 函数并突出显示行星“M
我有一个计算的可观察对象,它返回我的 observableArray 的过滤、排序版本,但排序根本不起作用。 这里是 My fiddle String.prototype.contains = fun
我想要一个 ko.observableArray 维护自己的排序顺序,其中排序顺序取决于每个项目的计算属性。 我希望它能工作: var threads = ko.observableArray().e
我有一个类似的 View 模型 AppViewModel = { agent : ko.observableArray([ { name : 'test',
我编写了简单的示例来了解 ko.observableArray 的工作原理。 **HTML**: Count is : JS: var anotherObservableArray = ko.ob
我有一个由 AJAX 调用填充的可观察数组,但它没有更新。 function ViewModel() { var self = this; self.FinanceTypes = ko
我有两个带有对象的 observableArray: self.firstHorizontalLineArr = ko.observableArray([{color: "red", val: 0},
我是一名优秀的程序员,十分优秀!