нокаут - проблема с доступом к вложенному свойству

Я пытаюсь изучить knockoutjs, изучая существующие исходные коды и внося в них небольшие изменения .. Исходный код, который я пытаюсь понять здесь, является примером knockout-sortable.js от Р.П. Нимейера.

Исходный пример кода находится здесь

Я внес несколько небольших изменений, которые здесь

Исходный код имеет глобальное свойство под названием 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 таблиц ..

Я попытался получить свойство allowedstudentgender, проверив 'arg.targetParent.allowedstudentgender', но он показывает undefined

Искренне приветствуется любая помощь.

Спасибо


person Arnab    schedule 29.03.2015    source источник


Ответы (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)

person lossleader    schedule 29.03.2015
comment
Спасибо ... только одно ... В вашем решении, если я перемещаю студента из таблицы в доступную область студентов ... визуально студент перемещается, но его нет в мастер-листе или json ниже .. Не могли бы вы просто проверить это .. Также в чем разница между parent () и parent в методе isTableFull? - person Arnab; 29.03.2015
comment
Проблема в том, что это не таблица, поэтому, когда мы добавляем свойства, она их не получает .. Мы могли бы сделать ее таблицей, продолжать повторять код или добавить защиту при доступе к этим новым свойствам. Но использование внешнего js в github усложняет задачу атаки. Для parent и parent () parent.x - это нормальное свойство, которое мы добавили к объекту JS объекта наблюдаемого при создании таблицы parent ( ) запрашивает фактический массив через официальный интерфейс ko (knockoutjs.com / documentation /) - person lossleader; 29.03.2015
comment
Кажется, github снова отвечает, поэтому я протестировал добавление специальной проверки для доступной таблицы, как в исходном примере, и, похоже, она работает. - person lossleader; 29.03.2015
comment
это gr8 .. также вы добавили maxstudents и allowedstudentgender у студентов в методе Table, но в данных initialTables образцы данных показаны в предыдущей схеме, следует ли мне оставить их как есть или следует также изменить, чтобы ответить методу таблицы .. - person Arnab; 29.03.2015
comment
Я бы не стал изменять initialTables для присоединения свойств к массиву, поскольку вам понадобится Table () для присоединения свойств после создания ko observableArray, и не следует рассчитывать на то, что он будет иметь какое-либо конкретное поведение для базового массива с дополнительными свойствами. Вы можете Считайте более чистым передать все свойства как один объект для Table () для копирования на объект ko, но существует множество мнений о том, как объединять объекты и использовать ли различные библиотеки, не относящиеся к теме .. - person lossleader; 29.03.2015