Javascript 在初始页面加载后填充时显示绑定元素

Javascript 在初始页面加载后填充时显示绑定元素,javascript,knockout.js,Javascript,Knockout.js,在中,我有一个包含2个联系人对象的列表,页面加载时有一个空的活动联系人对象。单击联系人列表下的“激活”链接时,我希望该联系人的属性填充活动联系人输入字段。目前,填充活动的_contact对象的我的函数正在启动,该值已按预期填充,但未显示在页面上(检查元素时,输入字段甚至未显示在代码中) 值得一提的是,这是我第一次使用Knockout,所以完全有可能我遗漏了一些非常基本的东西 守则: HTML var initialData=[ {姓:“丹尼”,姓:“拉鲁索”,电话:[ {类型:“手机”,号码:

在中,我有一个包含2个联系人对象的列表,页面加载时有一个空的活动联系人对象。单击联系人列表下的“激活”链接时,我希望该联系人的属性填充活动联系人输入字段。目前,填充活动的_contact对象的我的函数正在启动,该值已按预期填充,但未显示在页面上(检查元素时,输入字段甚至未显示在代码中)

值得一提的是,这是我第一次使用Knockout,所以完全有可能我遗漏了一些非常基本的东西

守则:

HTML

var initialData=[
{姓:“丹尼”,姓:“拉鲁索”,电话:[
{类型:“手机”,号码:“(555)121-2121”},
{类型:“主页”,编号:“(555)123-4567”}]
},
{姓:“老师”,姓:“宫城”,电话:[
{类型:“手机”,号码:“(555)444-2222”},
{类型:“主页”,编号:“(555)999-1212”}]
}
];
var ContactsModel=功能(触点){
var self=这个;
self.contacts=ko.observearray(ko.utils.arrayMap)(触点,功能(触点){
返回{firstName:contact.firstName,lastName:contact.lastName,phones:ko.observearray(contact.phones)};
}));
self.active_contact=ko.observable();
self.makeActive=函数(名字){
for(self.contacts()中的变量i){
if(self.contacts()[i].firstName==this.firstName){
console.log(self.contacts()[i]);
self.active_contact=self.contacts()[i];
}
}
}
};
ko.应用绑定(新联系人模型(初始数据))

联络
主动联系人:
名字
姓
电话号码
试试这个:

首先,我改变了这一点:

self.active_contact = self.contacts()[i];
为此:

var activeContact = self.contacts()[i];
self.active_contact(activeContact.firstName + " " + activeContact.lastName);
我也是新手,但我的理解是:
active\u contact
不是字符串对象;这是一个淘汰的可观测函数。要更改其值,必须调用该函数并传入新值

其次,我更改了您的数据绑定:

<div class="active" data-bind="with: active_contact">
    <div data-bind="text: firstName"></div>
</div>

为此:

<p style="font-weight: bold">
    Modified Active Contact Binding: 
    <span data-bind="text: active_contact"></span>
</p>

修改的主动触点绑定:


我还不熟悉
绑定的
,但是
文本
绑定应该很适合您的需要,不是吗?

self.makeActive中有两个问题:

.makeActive
不接收
名字
,它实际上接收完整的
联系人
对象-因此整个
for
循环是不必要的,因为您已经拥有了所需的内容

主要问题是:

self.active_contact = self.contacts()[i];
您并没有为可观察对象指定新的值,而是实际替换了可观察对象本身。这就是标记不再更新的原因——它最初绑定到的可观察对象现在不见了

请尝试以下方法:

self.makeActive = function (contact) {
  self.active_contact(contact);
};

谢谢你的回答,尼克,这确实解决了我提出的问题,但我在写问题时比自己聪明。我从淘汰文档中改编了一个示例来隔离这个特定问题。在我的实际应用程序中,我需要根据所选对象的各种属性填充多个表单字段。将编辑问题。