【问题标题】:Knockout foreach nesting issue淘汰赛foreach嵌套问题
【发布时间】:2014-12-11 01:36:07
【问题描述】:

我正在尝试使用两个视图模型的属性生成一个表,它们是主视图模型的子视图模型,使用 ko.applyBindings() 调用。

这个想法是为 SubVM1 中的每个元素生成一行,其中第一个单元格是元素的名称。然后对于 SubVM2 中的每个元素,都会在该行中添加一个额外的单元格。

行生成正确,第一个单元格显示 SubVM1 名称,但后面只有一个单元格,而不是 SubVM2 中有多少元素。

另外,数据绑定中的功能也不起作用。我尝试将 Value 函数声明为 SubV2 的原型,但错误为未定义。

无论如何,我不确定的事情显然是在绑定上下文中发生的,我们将不胜感激。

<tbody  data-bind="foreach: {data: SubViewModel1, as: 'SubVM1'}">
    <tr>
        <td data-bind="text: SubVM1.Name" />
        <!-- ko foreach: {data: $root.SubViewModel2, as: 'SubVM2'} -->
            <td data-bind="text: Value(SubVM1.Type)"></td>
        <!-- /ko -->
    </tr>
</tbody>

编辑:部分完成 jsfiddle:http://jsfiddle.net/jgr71o8t/1

【问题讨论】:

  • 请包含 jsfiddle
  • 这是一个代表问题的 jsfiddle:jsfiddle.net/jgr71o8t/4
  • 未捕获的错误:无法解析绑定。消息:ReferenceError:SubVM1 未定义;绑定值:文本:SubVM1.Name
  • jsfiddle.net/jgr71o8t/13 在这一个中,Name 工作并开始渲染,但它不访问 SubVM2。在虚拟 foreach 的数据绑定中的函数中键入。

标签: javascript knockout.js


【解决方案1】:

我可以看到几件事。 第一个是&lt;td data-bind='' /&gt;
Knockout 通常不喜欢自封闭标签。始终使用结束标记,在本例中为 &lt;td data-bind=''&gt;&lt;/td&gt;

第二个是你想要在屏幕上更新的任何东西都应该是 ko.observable 或 ko.observableArray。 ko.applyBindings 之后对属性的任何更改都不会反映在屏幕上

HTML

<table border="1">
    <tbody data-bind="foreach: {data: subViewModel1, as: 'SubVM1'}">
        <tr>
            <td data-bind="text: name"></td>
             <!-- ko foreach: {data: $root.subViewModel2, as: 'SubVM2'} -->
                <td data-bind="text: SubVM2.Value(SubVM1.Type)"></td>
            <!-- /ko -->
        </tr>
    </tbody>
</table>

JS Fiddle Demo with knockout bindings on all properties

function MasterViewModel() {
    var self = this;
    self.subViewModel1 = ko.observableArray([]);
    self.subViewModel2 = ko.observableArray([]);
}

function SubVM1ViewModel() {
    var self = this;
    self.name = ko.observable("Sub View Model 1");
    self.otherProperty = ko.observable(43);
}

function SubVM2ViewModel() {
    var self = this;
    self.title = ko.observable('Sub View Model 2');
    self.subVM1List = ko.observableArray([]);
}

SubVM2ViewModel.prototype.Value = function (type) {
    for (var i = 0; i < this.subVM1List().length; i++) {
        if (this.subVM1List()[i].Type === type) {
            return this.subVM1List()[i].name();
        }
    }
};

var masterVM = new MasterViewModel();

var subVM2 = new SubVM2ViewModel();
subVM2.subVM1List.push(new SubVM1ViewModel());

masterVM.subViewModel1.push(new SubVM1ViewModel());
masterVM.subViewModel2.push(subVM2);

ko.applyBindings(masterVM);

JS Fiddle Demo with straight javascript properties

function MasterViewModel() {
    var self = this;
    self.subViewModel1 = [];
    self.subViewModel2 = [];
}

function SubVM1ViewModel() {
    var self = this;
    self.name = "Sub View Model 1";
    self.otherProperty =43;
}

function SubVM2ViewModel() {
    var self = this;
    self.title = 'Sub View Model 2';
    self.subVM1List = [];
}

SubVM2ViewModel.prototype.Value = function (type) {
    for (var i = 0; i < this.subVM1List.length; i++) {
        if (this.subVM1List[i].Type === type) {
            return this.subVM1List[i].name;
        }
    }
};

var masterVM = new MasterViewModel();

var subVM2 = new SubVM2ViewModel();
subVM2.subVM1List.push(new SubVM1ViewModel());

masterVM.subViewModel1.push(new SubVM1ViewModel());
masterVM.subViewModel2.push(subVM2);

ko.applyBindings(masterVM);

【讨论】:

  • 谢谢。我不知道自闭标签问题。在应用绑定后,我在这个特定示例中的所有内容都不需要更新,除了标题中需要每个 SubVM2 的单选按钮的一些排除的内容。
猜你喜欢
  • 1970-01-01
  • 2011-08-11
  • 2013-04-20
  • 2013-05-15
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 2014-02-27
  • 2015-10-07
相关资源
最近更新 更多