1

我的应用程序中有以下视图模型:

var DashboardVM = function (serverData) {
    var self = this;
    self.tiles = ko.mapping.fromJS(serverData);
    self.someotherproperties
    ...
};
var tileData = @Html.Raw(Json.Encode(Model.Tiles));
var dashboardVM = new DashboardVM(tileData);
ko.applyBindings(dashboardVM);

我想为self.tiles. 我在网上看到了一些例子表明这是可能的,但我无法弄清楚执行此操作的正确语法。

4

2 回答 2

3

通过查看文档,您应该能够将一些映射选项传递给映射插件以自定义tiles项目的创建。在不了解您的数据结构的情况下,很难给出示例,但这可能对您有用:

var mapping = {
    'tiles' : {
        create: function(options) {
            return new specialTiles(options.data);
        }
    }
}

var specialTiles = function(data) {
    ko.mapping.fromJS(data, {}, this);

    this.tileSize = ko.computed(function() {
        return this.tileLength * 2;
    }, this);
}

现在,当您进行映射时,请传递映射选项:

ko.mapping.fromJS(serverData, mapping, this.tiles);
于 2013-05-17T01:59:21.700 回答
1

如果 serverData 是一个数组,你可以这样做。如您所见,我添加了一个名为comp的计算属性,它返回基于title属性的文本。

var DashboardVM = function (serverData) {
    var self = this;
    self.titles = ko.mapping.fromJS(serverData);
    for(var index =  0; index<self.titles().length; index++) {
        var item = self.titles()[index];
        item.comp = ko.computed(function(){
            return 'new' +item.title()
        });
    }
};
//var tileData = @Html.Raw(Json.Encode(Model.Tiles));
var titleData = [{title :'t1'}, {title :'t2'}, {title :'t3'}]
var dashboardVM = new DashboardVM(titleData);
ko.applyBindings(dashboardVM);


<div data-bind="foreach:titles">
    <span data-bind="text:title">
    </span>    
    <span data-bind="text:comp">
    </span>
    <br/>
</div>

见小提琴

我希望它有所帮助。

于 2013-05-16T21:37:16.250 回答