如何在数组中获取新的空对象

时间:2013-08-21 05:28:51

标签: javascript knockout.js requirejs hottowel

我有一个简单的应用程序,它使用了两个viewmodel和requirejs来组合它们,一切都很好,现在我被告知我需要有多个版本的嵌套视图模型所以我添加了一个数组,我的第一个项目很好但我不确定如何添加我的子请求项目。

在另一个页面上,系统会询问用户是否要添加其他用户,如果需要,我需要使用person数组中的新空people对象导航回此页面。

  • 如果我使用requirejs people.push(person)提供的对象,我会返回现有版本而不是新版本
  • 如果我只是向数组people.push({})添加一个新对象,那么我的挖空绑定不起作用,因为它们正在寻找不存在的值。

如何将“新”person加入people

这是我的视图模型和视图,

define(['viewmodel/person'], function (person) {
    var vm = {
        people: [],
        peopleIndex: 0,
        currentPerson: currentPerson,
    };

    return vm;

    //#region Internal Methods
    function currentPerson() {
        return vm.people[vm.peopleIndex]
    }
})

普通孩子

define(['services/logger', ], function (logger) {
    var person = {
        title: "",
        firstName: "",
        lastName: "",
    };

    return person;
})

查看

<section>
    <h2 class="page-title" data-bind="text: title"></h2>

    <label for="firstName">Title</label><input type="text" name="firstName" data-bind="value: currentPerson().title" />
    <label for="firstName">Fisrt Name</label><input type="text" name="firstName" data-bind="value: currentPerson().fistName" />
    <label for="firstName">Last Name</label><input type="text" name="firstName" data-bind="value: currentPerson().lastName" />
</section>

2 个答案:

答案 0 :(得分:1)

您需要将当前的person对象字面值更改为Person构造函数(您可能希望将属性设置为ko.observable以便value绑定工作) :

define(['services/logger', ], function (logger) {
    var Person = function() {
        this.title = ko.observable("");
        this.firstName = ko.observable("");
        this.lastName = ko.observable("");
    };
    return Person;
})

然后在您需要创建新人的viewmodel中,您可以使用new关键字创建新实例:

define(['viewmodel/person'], function (person) {

    //...
    people.push(new person())
}

如果包含所有属性,您可以使people.push({})工作:

people.push({
     title: ko.observable(""),
     firstName: ko.observable(""),
     lastName: ko.observable(""),
});

这样可行,但会在代码中引入重复,所以我不建议使用这种方法。

答案 1 :(得分:0)

您需要将当前人物对象文字更改为Person构造函数(您可能希望将属性设置为ko.observable以使您的值绑定工作):

define(['services/logger', ], function(logger) {
    var Person = function() {
        this.title = ko.observable("");
        this.firstName = ko.observable("");
        this.lastName = ko.observable("");
    };
    return Person;
})

然后在您需要创建新人的viewmodel中,您可以使用new关键字创建新实例:

define(['viewmodel/person'], function(person) {
    //...
    people.push(new person());
}

或者,如果包含所有属性,则可以使people.push({})起作用:

people.push({
    title: ko.observable(""),
    firstName: ko.observable(""),
    lastName: ko.observable(""),
});

这样可行,但会在代码中引入重复,所以我不建议使用这种方法