更新Knockout JS Observable Array中的元素

时间:2014-01-09 15:39:11

标签: c# knockout.js

我一直在阅读这个网站,最后有一个问题尚未得到足够的回答,因此我的需求就这样了。

我有一个可观察的数组,该数组是从在C#应用程序中传递给我的KO视图模型的数据数组创建的。

    self.Stuff = ko.observableArray(data.Stuff);

这个数组没有可观察的元素,这就是我的问题。我需要通过onclick编辑元素(状态)。我知道我需要使元素可观察(不确定如何使用data.Stuff部分)或执行“valueHasMutated”但我不完全确定该语法将如何工作。

当然,我的推送和删除工作正常,因为它们触发了arrayobservable并刷新了视图。

    if ($form.valid() && isValidStuff) {
        self.Stuff.push({ ABC: self.ABCInput(), XYZ: self.XYZInput(), Status: self.StatusInput()});
        self.resetValues();
    }

    self.removeStuff = function () {
        self.Stuff.remove(this);
    };

    self.StuffStatusChng= function (){
        //What to do?
        self.Stuff.vauleHasMutated();
    };

任何帮助或推动正确的方向将是一个很大的帮助,谢谢!如果我没有足够的信息,请告诉我我能提供的信息。

谢谢,

2 个答案:

答案 0 :(得分:1)

如何使用淘汰赛映射插件:

http://knockoutjs.com/documentation/plugins-mapping.html

它有一个fromJSON方法,它接受一个json字符串数组,并为每个属性创建一个带有observable属性的可观察数组:

可以在这里找到一个小提琴:http://jsfiddle.net/jiggle/uzn7Z/,一旦绑定通知,你可以更新名字,它会相应地更新属性

HTML:

<div data-bind="foreach: people">
       <div>
           <input type="text" data-bind="value:firstName"/>
           <span data-bind="text: firstName"></span>
           <span data-bind="text: lastName"></span>
    </div>

</div>

代码:

var stuff = '[{"firstName":"fred","lastName":"bloggs"},{"firstName":"david","lastName":"frost"}]';

console.log(stuff);
var people = ko.mapping.fromJSON(stuff);
console.log(people());
var viewModel ={};

viewModel.people=people;

ko.applyBindings(viewModel);

只需下载并包含knockout.mapping.js。

答案 1 :(得分:0)

这对你有帮助吗?

var OneStuff = function (data) {
    this.ABC = ko.observable(data.ABC);
    this.XYZ = ko.observable(data.XYZ);
    this.Status = ko.observable(data.Status);
};
self.Stuff = ko.observableArray(ko.utils.arrayMap(data.Stuff, function (oneStuffData) {
    return new OneStuff(oneStuffData);
}));

这将使各个属性可观察。

推动:

self.Stuff.push(new OneStuff({ ABC: self.ABCInput(), XYZ: self.XYZInput(), Status: self.StatusInput()}));