1

我有一个简单的应用程序,它使用两个视图模型和 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>
4

2 回答 2

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;
})

然后在您需要创建一个新人的视图模型中,您可以使用new关键字来创建一个新实例:

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

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

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

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

这会起作用,但它会在你的代码中引入重复,所以我不建议使用这种方法。

于 2013-08-21T05:35:29.173 回答
0

您需要将当前的 person 对象文字更改为 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;
})

然后在您需要创建一个新人的视图模型中,您可以使用 new 关键字来创建一个新实例:

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

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

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

这会起作用,但它会在你的代码中引入重复,所以我不建议使用这种方法

于 2013-09-26T11:18:49.387 回答