纠正KO绑定以访问数组中的对象?

时间:2013-08-03 17:36:46

标签: javascript knockout.js viewmodel single-page-application durandal

我有以下代码,我相信ViewModel的结构正确(我可能是错的)但我似乎无法正确访问这些值。

JavaScript Pieces

注意:我正在使用带有DurandalJS和<!-- ko compose -->样式绑定的Hot Towel SPA模板,但我没有在此处显示以保持简单。

var vm = {
    activate: activate,
    title: 'People',
    people: [
        new PersonItem('TestFirst', 'TestLast', 'first@last.com', '111.111.1111', 'bio here'),
        new PersonItem('TestFirst2', 'TestLast2', 'first2@last2.com', '222.222.2222', 'bio here')

    ],
    mytext: 'Oh Hey There'
};

return vm;

function PersonItem(firstname, lastname, email, phone, shortbio) {
    var firstName = firstname;
    var lastName = lastname;
    var emailAddress = email;
    var phoneNumber = phone;
    var shortBio = shortbio;

    var fullName = function () {
        return firstName + " " + lastName;
    };

    var imagePath = function() {
        return "/Content/images/Bio_" + firstName + "_" + lastName + ".jpg";
    };

    var resumePath = function () {
        return "/Content/Resumes/resume_" + firstName + "_" + lastName + ".pdf";
    };

我正在尝试绑定

<div data-bind="text: mytext"></div>

<ul data-bind="foreach: people">
    <li data-bind="text: firstName"></li>
</ul>

问题

我看到一个子弹被创建,这似乎表明正在找到该集合,但我试图访问“firstName”的方式似乎无法正常工作。

我看到以下内容(请注意文本字符串是绑定的,所以我知道knockout正在做它的事情):

enter image description here

我知道这可能是我的一个简单的疏忽,但我似乎无法看到它并且谷歌让我空了(可能是因为我不确定要搜索的是什么)。

2 个答案:

答案 0 :(得分:3)

在PersonItem中,您将firstName定义为变量声明的私有属性。 这表明它只在Class本身内可见。

尝试将其更改为

this.firstName = firstname;

你也可能不想考虑使用observables,如果这些值会发生变化会产生。

this.firstName = ko.observable(firstname);

答案 1 :(得分:0)

这是因为你的firstName被声明为var所以它是函数内部的私有变量,而不是构造函数返回的对象的属性。请使用this.firstName代替var firstName

您在jsfiddle工作的代码:http://jsfiddle.net/hC5Hf/

您的函数中缺少右括号并且激活已在vm中注释掉,因为它在您的示例中不存在。