【问题标题】:knockout - issue with accessing a nested property淘汰赛 - 访问嵌套属性的问题
【发布时间】:2015-06-02 09:54:46
【问题描述】:

我正在尝试通过研究现有源代码并对它们进行小的更改来学习 knockoutjs。我在这里尝试理解的源代码是 RP Niemeyer 的 knockout-sortable.js 示例。

原始示例代码为here

我做了一些小的改动,它们是here

原始代码有一个名为 maximumstudents 的全局属性,用于检查每个表中的学生人数。我在表格中添加了一个名为“maxstudents”的属性,它将决定每张桌子可以坐多少学生。

原始代码还使每个表都可以填满男女学生。我正在尝试查看是否可以根据性别隔离某些表格。 为此..我还添加了另一个属性“allowedstudentgender”,它将决定哪个性别的学生可以坐在哪个桌子上..

这段代码的变化如下所示..

    var Table = function(id, name, students,maxstudents,allowedstudentgender) {
    this.students = ko.observableArray(students);
    this.students.id = id;
    this.name = ko.observable(name);
    this.maxstudents=ko.observable(maxstudents);
    this.allowedstudentgender=ko.observableArray(allowedstudentgender);
};

以及数据的连续变化:

 var initialTables = [
    new Table(1,"Table One",  [
       new Student(3, "Jim", "male"),
         new Student(6, "Chase", "male")
    ],2,["male"]),
    //and so on...

决定每个表中学生人数的原始方法如下..

 this.isTableFull = function(parent) {
            return parent().length < self.maximumStudents;
        };

我想弄清楚的是如何在这个方法中获取表格的 maxstudents 属性..

另外..要根据性别隔离用户,我需要更改 -verifyAssignments 方法..

当前功能由以下代码块检查..

if (!ko.utils.arrayFirst(parent(), function(student) { return student.gender !== gender;})){// .... }

这里我需要弄清楚如何将学生的性别映射到表的 allowedstudentgender 属性..

我试图通过检查“arg.targetParent.allowedstudentgender”来获取 allowedstudentgender 属性,但它显示未定义

真诚感谢任何帮助..

谢谢

【问题讨论】:

    标签: knockout.js knockout-2.0 knockout-sortable


    【解决方案1】:

    由于arg.targetParent 放置学生时实际上是学生数组而不是包含它的表格,因此您可以移动它下面的所有内容:

    var Table = function(id, name, students,maxstudents,allowedstudentgender) {
      this.students = ko.observableArray(students);
      this.students.id = id;
      this.name = ko.observable(name);
      this.students.maxstudents=ko.observable(maxstudents);
      this.students.allowedstudentgender=ko.observableArray(allowedstudentgender);
    };
    

    然后调整对新位置的任何引用并修改新规则的处理程序:

    this.verifyAssignments = function(arg) {
        var parent = arg.targetParent;
    
        if (parent.id !== "Available Students" && parent.allowedstudentgender().length === 1 && arg.item.gender != parent.allowedstudentgender()[0]) {
            self.lastError("Cannot move " + arg.item.name() + " to " + arg.targetParent.id + " because the table is unigender.");
                arg.cancelDrop = true;
        }
    
    };
    

    (jsfiddle)

    【讨论】:

    • 谢谢..只是一件事..在您的解决方案中,如果我将学生从桌子移动到可用的学生区域..视觉上学生移动但他不在下面的主列表或 json 中..你能检查一下吗.. isTableFull 方法中的 parent() 和 parent 有什么区别?
    • 对于“可用”的问题是它不是一个表,所以当我们添加属性时它没有得到它们。我们可以把它变成一个表,继续重复代码,或者在访问中添加保护这些新属性。但是在 github 上使用外部 js 使得现在很难进行攻击。对于 parent 与 parent(),parent.x 是我们在创建表时添加到 observable 的 JS 对象的普通属性, parent( ) 是通过ko的官方接口(knockoutjs.com/documentation/…)请求实际数组
    • github 似乎又响应了,所以我测试了在原始示例中添加对可用表的特殊检查,它似乎有效。
    • 那是 gr8 .. 您还在 Table 方法中的学生中添加了 maxstudents 和 allowedstudentgender,但在 initialTables 数据中,示例数据显示在上一个模式中,我应该保持原样还是应该更改以及往复表方法..
    • 我不会更改 initialTables 以将属性附加到数组,因为一旦创建了 ko observableArray,您需要 Table() 来附加属性,并且不应该指望它对基础有任何特定行为具有附加属性的数组.. 您可能会发现将所有属性作为一个对象传递给 Table() 以复制到 ko 对象上更简洁,但是对于如何合并对象以及是否使用各种离题有很多意见图书馆..
    猜你喜欢
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    相关资源
    最近更新 更多