【问题标题】:Knockoutjs with mapping.fromJS and template带有 mapping.fromJS 和模板的 Knockoutjs
【发布时间】:2013-01-20 11:20:31
【问题描述】:

我的模型中的每个条目都更新了一个表,并且在删除和添加到数组时触发了两个事件。 hideElement 调用 jquery "fadeOut" 和 showElement 调用 jquery "fadeIn" 函数来创建漂亮的淡出/淡入效果。

<tbody  data-bind='template: { foreach: entries,
     beforeRemove: hideElement,
     afterAdd: showElement }'>

我的模型是这样的:

var Model = function() {
self.entries = ko.mapping.fromJS([]);
this.getData = function() {
$.ajax({
    url: "/test",
    type: "GET",
    success: function(response) {
        ko.mapping.fromJS(response, self.entries);
...

this.showElement = function(elem) { 
    if(elem.nodeName == "TR") {
         $(elem).fadeIn(500);
    }
};

this.hideElement = function(elem) { 
    if(elem.nodeName == "TR") {
       $(elem).fadeOut(500);
    };
};
...

问题在于,每次在 ajax 响应中调用 ko.mapping.fromJS(response, self.entries) 时,即使条目完全相同,敲除似乎也在删除/添加条目。因此,调用了 showElement/hideElement 并且我的表中的元素正在“闪烁”,因为它们在每个 ajax 调用中都会被删除/添加。

应该是这样还是我用错了?

【问题讨论】:

  • 您的entries 收藏中的项目是什么样的?它们是否有一些唯一标识符,例如 id?
  • 是的,他们有来自 mysql 数据库的 id。 ID 是主键。
  • 你需要在mapping pugin中使用key选项,让插件知道哪些项目是相同的
  • 将 ID 添加为密钥就像一个魅力!谢谢!

标签: javascript jquery knockout.js knockout-mapping-plugin


【解决方案1】:

你需要在映射插件中使用key选项,以便插件知道哪些项目是相同的

http://jsfiddle.net/yWwfz/

var mapping =  {
    items: {
        key: function(item) { return item.id; }
    }
};
ko.mapping.fromJS(data, mapping, this);

【讨论】:

  • 是的,我就是这样做的,它根据您上面的评论起作用。谢谢。 ` ko.mapping.fromJS(response,{ key: function(data) { return ko.utils.unwrapObservable(data.id); }}, self.entries);`
  • 虽然如果你想确保你从服务器中提取了一个全新的项目列表......那么确保 KO 完全删除并重新添加所有项目不是更好吗? (最好不要告诉KO关键是什么?)
猜你喜欢
  • 2014-04-26
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 2012-01-04
  • 2012-07-06
  • 1970-01-01
相关资源
最近更新 更多