【发布时间】:2013-06-27 09:22:20
【问题描述】:
我的背景主要是 asp.net/c#,我是 Durandal/Knockout 的新手。我正在尝试构建一个视图以显示对象列表,并在选择一个项目后显示所选项目的数据。我的问题是,无论选择什么项目,返回的数据始终是最后一个项目的数据。
以下是我的看法,
...标记未显示
<div data-bind="visible: convenios().length > 0" style="height:30px">
Pesquisa retornou <span data-bind="text: convenios().length"></span> conveniados.
</div>
<div class="row-fluid">
<section class="grd-convenio" data-bind="foreach: convenios" style="width:25%; height:300px; overflow-y: scroll">
<article>
<div class="grd-convenio-detalhe" title="Clique para alterar">
<span class="grd-convenio-nome" data-bind="text: nome"></span>
<span class="grd-convenio-id" data-bind="text: id"></span><br/>
<span class="grd-convenio-cidade" data-bind="text: cidade"></span>
<span class="grd-convenio-ativo" data-bind="text: servicosativos"></span>
</div>
</article>
</section>
</div>
和我的视图模型的一部分:
var convenio = function (id, nome, cidade, cnpjcpf, servicosativos) {
self = this;
self.idformatado = ko.observable("[" + id + "]");
self.id = ko.observable(id);
self.nome = ko.observable(nome);
self.cidade = ko.observable(cidade);
self.cnpjcpf = ko.observable(cnpjcpf);
self.servicosativos = ko.observable(servicosativos);
self.estiloativo = ko.computed(function () {
if (self.servicosativos() > 0)
return 'grd-convenio-detalhe-ativo';
else
return 'grd-convenio-detalhe-inativo';
});
self.convenioselecionado = ko.observable("");
return self;
};
var convenios = ko.observableArray([]);
var tamanho = ko.observable("0");
var convenioselecionado = ko.observable("");
var pesquisacodigo = ko.observable("");
var pesquisanome = ko.observable("");
var pesquisacidade = ko.observable("");
var filtrar = function () {
... Retrieve data from Database and pushes data into convenios observablearray
$.each(resultado.pesquisa.retorno, function (i, item) {
convenios.push(new convenio(item.idconveniado, item.nome, item.cidade, item.cnpjcpf, item.servicosativos));
});
};
alterarCadastro = function (selecionado) {
if (selecionado && selecionado.id()) {
alert(selecionado.nome());
}
};
var viewAttached = function(view) {
bindEventToList(view, '.grd-convenio-detalhe', alterarCadastro);
};
var bindEventToList = function (rootSelector, selector, callback, eventName) {
var eName = eventName || 'click';
$(rootSelector).on(eName, selector, function () {
var selecionado = ko.dataFor(this);
callback(selecionado);
return false;
});
};
return {
convenios: convenios,
filtrar: filtrar,
tamanho: tamanho,
pesquisacodigo: pesquisacodigo,
pesquisanome: pesquisanome,
pesquisacidade: pesquisacidade,
alterarCadastro: alterarCadastro,
displayName: 'Convênio',
viewAttached: viewAttached
}
});});
视图按预期显示,但是当我选择任何项目时,bindEventTolist 函数中返回的数据 (ko.datafor) 始终是最后一个项目的数据。我究竟做错了什么?这是处理这类应用程序的好方法吗? TIA。
【问题讨论】:
-
返回最后一项的数据是什么意思?您的警报设置为显示单击的任何内容,但不会对该数据执行任何操作。
-
@kadumel 这是问题所在。警报始终显示 last 项的属性“nome”,而不是实际单击的项的属性“nome”。我需要获取单击项目的 id 以显示其数据,但由于我总是得到最后一个项目的数据,所以我还没有做任何事情。我只是显示返回的“名称”的警报。
-
由于语言差异,遵循代码有点困难,但出于所有意图和目的,您的 alert() 应该显示当前对象。您能否创建一个重现此问题的小提琴,以便我们查看后台发生的情况?
-
对不起@kadumel。尽管 js 代码没问题,但我无法使小提琴工作。你知道,我对所有这些工具都是新手。但是如果你想看看 [fiddle] (jsfiddle.net/zenute/yQgAm/4)。我相信它会帮助你理解。我点击的任何项目,警报总是返回'name4'。
-
@kadumel ,我在小提琴 [new fiddle] (jsfiddle.net/zenute/yQgAm/6) 中做了一个小改动
标签: knockout.js