【问题标题】:Kendo UI datasource sync() will not workKendo UI 数据源同步()将不起作用
【发布时间】:2015-06-20 03:22:28
【问题描述】:

在下面的代码中, fetch() 和 sync() 方法没有做任何事情。 我正在尝试查看我的 localStorage 中的数据是如何更新的,并且方法没有更新它(示例 LS 字符串在代码中) 我哪里错了?

function makeWorkingLS(collDesc, projDesc, Id, Description, ElapsedSeconds, ElapsedTime, WorkItemType){

//Create observable object from params
var activeTaskObject = kendo.observable ({
    client: collDesc,
    project: projDesc,
    taskId: Id,
    description: Description,
    elapsedSeconds: ElapsedSeconds,
    elapsedTime: ElapsedTime,
    comment: WorkItemType 
});
// example string in localStorage:
//{"client":"Morken Mindy","project":"Shazbat creation engine","taskId":183,"description":"Create the Shazbat 100% efficiency engine","elapsedSeconds":296803,"elapsedTime":"82h43m","comment":"Task"}  
// Convert to JSON string for localStorage
var activeTask = JSON.stringify(activeTaskObject);
console.info(activeTask);

//Write to localStorage
window.localStorage.setItem("activeTask",activeTask);

//Set it as the active datasource for updating to webservice
var activeTaskDS = new kendo.data.DataSource({
    transport: {
        read: function(options){
            taskItem = JSON.parse(localStorage["activeTask"]);
        },
        update: {
            url: remUpd, //url var declared earlier in the process
            dataType: "json"
        }
    },
    schema: {
        model: {
            client: "client",
            taskId: "taskId"
        },
        data: function(){
            return taskItem;
        }

    }
});

activeTaskDS.fetch(function(){
    activeTaskDS.data()[0].set("client", "NOBODY");
    activeTaskDS.sync();
    cosole.log("activeTaskDS.data()[0]  :  "+activeTaskDS.data()[0]); //should read 'NOBODY' but reads 'Morken Mindy'
});

}

提前致谢, 尼尔。

【问题讨论】:

    标签: javascript user-interface kendo-ui synchronization


    【解决方案1】:

    我不确定实际上是什么问题,但我必须指出一些重要的事情:

    1. AFAIK,当您自定义任何 transport 方法时,您必须将数据传递到 options 对象中的回调:

      transport: {
          read: function(options){
              taskItem = JSON.parse(localStorage["activeTask"]);
      
              // Tells the widget to handle that collection
              options.success(taskItem); 
          }
      }
      
    2. schema.data 中,您似乎想通过此方法传递数据(如果我错了,请纠正我)。但这种方法不是为了那个目的。它仅用于告诉小部件要读取哪个字段(在向其传递字符串的情况下)或从 response 读取属性,这是您未使用的参数。检查第二个示例here。所以这可能不是将taskItem 对象作为数据读取的正确方法;

    3. 谈到 taskItem 对象,它似乎是您的 dataSource 的基础数据,但它没有定义(至少在您发布的 sn-p 上)。我的意思是,如果您按照第 1 步操作,您甚至不再需要从该对象中读取

    如果这有帮助,如果您需要更多信息,请告诉我。

    【讨论】:

    • 谢谢。这让我更好地理解了我需要如何继续。
    • @NeilMcLeish 但这回答了你的问题还是你有问题?
    • 谢谢。它部分回答了我的问题,但没有告诉我为什么 sync() 函数实际上没有更新 localStorage 中的数据。对于这个特定的项目,我发现使用 $.ajax() 调用更有效。将数据发送回 Web 服务时需要检查许多条件,因为 Telerik 的 Kendo MobileUI 文档似乎只显示了高度简化的示例,我选择使用我所知道的......
    • ...感谢您的意见,不胜感激。我想暂时不回答这个问题,直到对 sync() 操作的更详细解释即将到来,就其工作原理和数据方式的预期而言。
    • 嗨@DontVoteMeDown。新年快乐!对此没有更新。我使用了一种方法,将所需的数据传递给纯 JS 对象,根据需要对其进行操作,根据需要更新 localStorage,直到需要将数据发送回 Web 服务;这最后一部分是通过 ajax 完成的。我知道这并不理想,但时间限制迫使该解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    相关资源
    最近更新 更多