Javascript 使用“Knockout.js”;加上;束缚的悲哀
我有一个应用程序具有以下设置(或多或少): JSJavascript 使用“Knockout.js”;加上;束缚的悲哀,javascript,asp.net-mvc,knockout.js,Javascript,Asp.net Mvc,Knockout.js,我有一个应用程序具有以下设置(或多或少): JS var ObjectVM = function(data) { var me = this; me.name = ko.observable(data.name); //Set other properties ... me.isSelected(false); }; var VM = function () { var me = this; me.Records = []; me
var ObjectVM = function(data) {
var me = this;
me.name = ko.observable(data.name);
//Set other properties
...
me.isSelected(false);
};
var VM = function () {
var me = this;
me.Records = [];
me.Selected = ko.observable(undefined);
me.Select = function (rec) {
if (rec.hasChanges == undefined) {
//attach editable functionality
ko.editable(record);
}
rec.isSelected(true);
rec.beginEdit();
if (me.Selected() != undefined) {
if (me.Selected().hasChanges()) {
me.Selected().rollback();
}
me.Selected().isSelected(false);
me.Selected().commit();
}
me.Selected(rec);
//Do some hiding/showing of form...
};
me.Init = function(){
$.ajax({...,
success: function(data){
for(var i = 0;i< data.length;i++){
me.Records.push(new ObjectVM(data[i]));
}
}
};
};
var ObjectVM=函数(数据){
var me=这个;
me.name=ko.observable(data.name);
//设置其他属性
...
我被选为(假);
};
var VM=函数(){
var me=这个;
me.Records=[];
me.Selected=可观测(未定义);
me.Select=函数(rec){
if(rec.hasChanges==未定义){
//附加可编辑功能
ko.可编辑(记录);
}
rec.isSelected(正确);
rec.beginEdit();
如果(me.Selected()!=未定义){
如果(me.Selected().hasChanges()){
me.Selected().rollback();
}
me.Selected().isSelected(false);
me.Selected().commit();
}
me.Selected(rec);
//做一些隐藏/显示表单。。。
};
me.Init=函数(){
$.ajax({。。。,
成功:功能(数据){
对于(变量i=0;i
HTML
<div>
RECORDS DISPLAY GRID (Pretend it's a table with 5 columns and 10 rows)
</div>
<div data-bind="with: Selected">
<form id="editRec">
<label>Name</label>
<input data-bind="value: name" />
</form>
</div>
记录显示网格(假设它是一个包含5列和10行的表)
名称
我在调用VMs Select Function的表行上有一个单击绑定设置。当Select()未定义时,使用“with”绑定会删除表单,当Select()有记录时,会添加回表单。问题是每次出现这种情况时,我都会丢失验证、选项卡和事件绑定(非KO绑定)应用程序功能完美,但在记录之间更改时会出现一些性能问题,因为它必须重新添加表单、设置验证、ui配置和绑定
有没有办法让表单留在页面上,保留我的绑定和设置,或者每次选择的值发生更改时,我都要被迫处理点击?目前,带绑定的
将其内容视为模板,并在带
值的更改时重新呈现。避免重新呈现的唯一方法是g不得将与
一起使用
<div>
<form id="editRec">
<label>Name</label>
<input data-bind="value: Selected().name" />
</form>
</div>
第三种避免重新呈现并支持未定义的值的替代方法是使用Knockout 2.2和if
绑定(并使用避免)。在2.2中,if
绑定仅在值从一个truthy值变为另一个truthy值时才会重新呈现
<!--ko if: Selected-->
<div data-bind="setUpStuff: true">
<form id="editRec">
<label>Name</label>
<input data-bind="value: Selected().name" />
</form>
</div>
<!--/ko-->
名称
您使用的是什么版本的KO?我想我在某个地方读到,在2.2中,目前2.1上不应该再出现这种情况(对此没有积极的看法),我现在就尝试一下,让您知道!@AndrewHitaker在更新中没有骰子,我很有希望:(@jjperezaguinaga我明白你的意思,但我更愿意奖励那些正确回答我问题的人。当我问到切苹果的最佳方法时,我有两个关于更换猫砂的回答……你会怎么做?吃猫砂!开玩笑,我明白你的意思,希望你将来能得到更好的答案:)出于某种原因,使用Selected().name不会填充输入字段的值。自定义绑定基本上就是我当前在选择记录时所做的。请注意,我选择了Selected().name
,因为Selected
是一个可观察的对象。是的,这是HTML中的方式,我只是忘记添加()在commentAcutally中,我尝试在没有表单的情况下测试它,只是简单的HTML,它成功了。我会看看我能走多远。谢谢!如果你想这样做,最好使用Selected()&&Selected().name
。最佳做法是使用
绑定的
不会重新渲染,但我们必须解决这个问题。我制作了一个fork of Knockout(),其中包括一个使用
绑定的
,该绑定在值更改时不会重新渲染。
<!--ko if: Selected-->
<div data-bind="setUpStuff: true">
<form id="editRec">
<label>Name</label>
<input data-bind="value: Selected().name" />
</form>
</div>
<!--/ko-->