0

好的,我有大量的分层数据。

我 foreach 超过 1 部分

然后我有一个有效的下拉列表

<p  data-bind="visible: Id">
  Race:
  <select data-bind="options: $parent.data.Races, optionsText: 'Name' , optionsValue:        'Id',     value: RaceId, optionsCaption: 'Choose...'"></select>
</p> 

但是使用 matchId 来查找有效性别的绑定不起作用,因为上下文不会随着 with 绑定而改变。

<p data-bind="with: $parent.data.Races()[ RaceId ]">
    <pre data-bind="text: ko.toJSON($data,null , 2) "></pre> //debug

    Gender:
    <select data-bind="options: Genders, optionsText: 'Name' , optionsValue: 'Id', value:  $parent.Gender, optionsCaption: 'Choose...'"></select>
</p>

注意它的 with 不能改变上下文,一切都是可观察的。

我曾想过使用一个函数来执行此操作,但这也有点棘手,因为它需要在raceId 更改时进行更改(并且当未设置raceId 时,要么隐藏要么为空列表)

任何帮助,将不胜感激。

这是我当前的函数尝试(是的,我是 javascript 新手),尽管 with 绑定会更加优雅。

self.getGenderForRace = ko.computed( function () {
    if ( this && this.data) {
        return this.data.Races()[this.RaceId].Genders;
    } else {
        return new Array();
    }

    deferEvaluation: true;
}, this);

这是我的一些视图模型

l6.CreateViewModel = function (options) {
var self = this;


//this.getGenderForRace = ko.computed(function (character) {
//    return this.data.Races()[character.RaceId].Genders;
//}, this);

self.getGenderForRace = ko.computed( function () {
    if ( this && this.data) {
        return this.data.Races()[this.RaceId].Genders;
    } else {
        return new Array();
    }

    deferEvaluation: true;
}, this);

self.setData = function (url, raceId, factionId, viewmodel) {



    $.getJSON(url, { raceId: raceId, factionId: factionId }, function (data) {
        viewmodel.data = ko.mapping.fromJS(data.Data);

        ko.applyBindings(viewmodel);  // we dont bind till we get data
        // add to strcture and map!
        //self.data = data.Data; 
        $("#tabContainer").tabs();

    });
4

3 回答 3

1

如果您像我在我的项目中所做的那样分解数据,根据每个选择,您必须进行 ajax 调用,这里有一个如何做到这一点的示例。

http://jsfiddle.net/Zholen/h7j3f/

于 2012-10-17T19:37:03.620 回答
0

如果你想包含deferEvaluation: true,你应该把它作为一个选项传递给ko.computed

self.getGenderForRace = ko.computed({
    read: function() {
        if ( this && this.data) {
            return this.data.Races()[this.RaceId].Genders;
        } else {
            return [];
        }
    },
    deferEvaluation: true
}, this);
于 2012-10-17T10:36:10.693 回答
0

这是一个工作小提琴,演示了一种方法来做你正在寻找的东西:http: //jsfiddle.net/jearles/Q8kcs/

你有什么理由搞乱ID吗?使用选择值绑定可以保存整个选定的 observable。这使我们可以轻松访问可用的子选项。

于 2012-10-17T10:47:49.023 回答