我正在尝试创建一些标签,每个用户选择保存的个人资料。每个配置文件都是ViewModel。所以我想我只是创建另一个ViewModel,它包含一个observableArray类型的对象:{name:profile_name,model:model_converted_to_json}。
我跟着this example创建了我的代码 - 但由于某种原因,我没有任何约束。
这是我的代码:
-ViewModel(我使用Requirejs,它解释了外部包装器):
"use strict";
// profiles viewmodel class
define(["knockout"], function(ko) {
return function() {
var self = this;
this.profilesArray = ko.observableArray();
this.selected = ko.observable();
this.addProfile = function(profile) {
var found = -1;
for(var i = 0; i < self.profilesArray().length; i++) {
if(self.profilesArray()[i].name == profile.name) {
self.profilesArray()[i].model = profile.model;
found = i;
}
}
if(found == -1) {
self.profilesArray().push(profile);
}
};
};
});
- JS代码(较大文件的摘录):
var profiles = new profilesViewMode();
ko.applyBindings(profiles, $("#profileTabs")[0]);
$("#keepProfile").on("click", function() {
var profile = {
name: $("#firstName").text(),
model: ko.toJSON(model)
};
profiles.addProfile(profile);
profiles.selected(profile);
console.log(profile);
$("#profileTabs").show();
});
- HTML(感谢Sara纠正我的HTML标记)
<section id="profileTabs">
<div>
<ul class="nav nav-tabs" data-bind="foreach: profilesArray">
<li data-bind="css: { active: $root.selected() === $data }">
<a href="#" data-bind="{ text: name, click: $root.selected }"></a>
</li>
</ul>
</div>
</section>
我已经验证observableArray在点击按钮时确实获得了新的正确值 - 它只是不会被渲染。我希望我的Knockout数据绑定语法中缺少一些小东西。
谢谢你的时间!
答案 0 :(得分:5)
您需要直接在observableArray上调用push
,它将推送到底层阵列并通知任何订阅者。所以:
self.profilesArray.push(profile);
答案 1 :(得分:3)
您使用name: $('#firstName').text()
设置名称;如果这是引用输入字段(我在此假设),您可能需要将其更改为.val()
。
您在基础数组上使用.push()
绕过ko的订阅者(在这种情况下为绑定)
根据您的代码,这是a working jsfiddle。我对model
采取了一些自由,因为没有包括在内。