淘汰foreach绑定,更新值

Posted

技术标签:

【中文标题】淘汰foreach绑定,更新值【英文标题】:Knockout foreach binding, update value 【发布时间】:2014-08-20 16:55:54 【问题描述】:

我得到了 ko 模型:

var Model = function(notes) 
    this.note = ko.observableArray(notes);
; 

var model = new Model(["post":"a","post":"b"]);
ko.applyBindings(model);

还有html div:

<div data-bind='foreach: note'>
    <p><span data-bind='text: post'>
    <p><input data-bind='value: post'>
</div>

这是小提琴:http://jsfiddle.net/DE9bE/

我想在 input 中输入新文本时更改我的 span 值,就像在那个小提琴中一样:http://jsfiddle.net/paulprogrammer/vwhqU/2/ 但它没有更新。我如何在 foreach 绑定中做到这一点?

【问题讨论】:

【参考方案1】:

对象的属性需要做成observables。

您可以自己手动执行此操作(我在这里使用了普通的 js 数组 map 方法,如果您需要 IE8 支持,您可以使用 ko.utils.arrayMap 用于相同目的):

var Model = function(notes) 
    this.note = ko.observableArray(notes.map(function(note)
        note.post = ko.observable(note.post);
        return note;
    ));
; 
var model = new Model(["post":"a","post":"b"]);
ko.applyBindings(model);

Demo


或者您可以使用mapping plugin(您需要包含的单独的 js 文件)为您(递归地)执行此操作。

var Model = function(notes) 
    this.note = ko.mapping.fromJS(notes);
; 
var model = new Model(["post":"a","post":"b"]);
ko.applyBindings(model);

Demo


如果您从服务器获取整个数据对象,您也可以直接提供它:

var model = ko.mapping.fromJS(
    note: ["post":"a","post":"b"]
);
ko.applyBindings(model);

Demo

【讨论】:

非常感谢。现在我知道问题出在哪里了。【参考方案2】:

你想要的是一个带有 observables 的 observable 数组,否则你的 span 将不会更新,因为你正在更改一个不可观察的变量,请参阅这篇文章。

KnockoutJS - Observable Array of Observable objects

【讨论】:

【参考方案3】:

试试这个:

HTML

<div data-bind='foreach: note'>
    <p><span data-bind='text: post'></span></p>
    <p><input data-bind='value: post'/></p>
</div>

javascript

 var Model = function (notes) 
      this.note = ko.observableArray(notes);
 ;
 var Post = function (data) 
     this.post = ko.observable(data);
 ;

 var model = new Model([new Post("a"), new Post("a")]);
 ko.applyBindings(model);

Demo

【讨论】:

以上是关于淘汰foreach绑定,更新值的主要内容,如果未能解决你的问题,请参考以下文章

淘汰赛无法处理“foreach”的绑定

淘汰赛foreach绑定不起作用

如何在淘汰赛 foreach 绑定中使用表单

淘汰赛 JS 选择初始值在 foreach 循环内未正确显示

如何将项目从淘汰赛 foreach 传递到部分视图作为数据绑定?

淘汰赛样式绑定未更新