【问题标题】:Automapping ajax data during ajax put or post in knockout在 ajax put 或 post in knockout 期间自动映射 ajax 数据
【发布时间】:2015-10-10 03:05:07
【问题描述】:

在 ajax 获取请求期间,我们可以使用 ko.mapping.fromJS 从服务器获取数据并进行自动映射。另外,我们可以使用 ko.mapping.toJS 将 ajax 数据发布或放入服务器中。

但是,假设 ko.mapping.toJS 中的每个值都将在 ajax 调用中传回。我们可以使用 delete 或 ignore 来删除不应传回服务器的属性。

最近,我遇到了以下问题。如果不显式分配或忽略数据,我怎么能传递我想要的数据,因为它太麻烦了。我认为重组视图模型可能会完成这项工作,但不知道如何开始。

function MyViewModel() {
  var self = this;
  
  // these data should not be pass in ajax call
  self.data1 = ko.observable();
  self.data2 = ko.observable();
  self.data3 = ko.observable();
  ...
  self.data50 = ko.observable();
  
  // these data should not be pass in ajax call
  self.noData1 = ko.observable();
  ...
  self.noData10 = ko.observable();
  
 // these should not be pass in ajax call
  self.function1 = function() { }
  self.function2 = function() { }
  self.function3 = function() { 
     $.ajax({
       ..
       type: 'POST',
       data: { ko.mapping.toJS(self) },
       success: {}  
  }
  ...
  self.function50 = function() {}
};

ko.applyBindings(new MyViewModel());

【问题讨论】:

    标签: javascript jquery ajax knockout.js


    【解决方案1】:

    我这样做的方式有点像@super cool,除了我有用于 to/from 服务器的 DTO,它们是 JavaScript 对象,但属性仍然与我的模型匹配。

    //use this for server interaction
    var personFromDto = function(Person) {
        this.Name = Person.Name;
        this.Phone = Person.Phone;
    }
    var personToDto = function(Person) {
        this.Name = Person.Name();
        this.Phone = Person.Phone();
    }
    

    您也可以始终将其映射到您的可观察模型表示。

    var Person = function(Person) {
       this.Name = ko.observable(Person.Name);
       this.Phone = ko.observable(Person.Phone);
    }
    

    这只是我确信您可以做到的众多方法中的一种。

    【讨论】:

    • 为什么 personFromDto 中的 Person.Name 没有 () 但在 personToDto 中却有 ()。以及如何在 var Person = function(Person) 中将 personToDto 传递给 ajax?
    • 因为我们正在将数据从服务器加载到符合我们预期的 JavaScript 模型中
    • 是的,你做错了什么。你有 2 个 var Person
    • 我已经更新了 jsfiddle,但似乎我无法在 persion 视图模型中访问 personToDto。 jsfiddle.net/kjv8Ldt9
    • PersonToDto 是一个也接受参数的函数。你试图简单地作为一个对象或其他东西来访问它。
    【解决方案2】:

    有一种技术,我称之为对所需集合进行分组,而不会干扰 2 路绑定和其他依赖项。

    视图模型:

    var ViewModel = function (first, last, age) {
        this.firstName = ko.observable(first);
        this.include = { // this set you can pass in you ajax call & skip remaining .
            lastName: ko.observable(last),
            age: ko.observable(age)
        }
    };
    ko.applyBindings(new ViewModel("Planet", "Earth", 25));
    

    工作示例 here 预览显示所有内容都完好无损。

    PS:恕我直言,这不是更改/重建我们的 viewModel 的明智方法(在复杂的应用程序中,可维护性可能会受到威胁)

    【讨论】:

    • 你是在暗示你展示的方法不是明智的方法吗?
    • @stackdisplay As far 方法走上了它的路(简单)。为了发布所需的数据(通过 ajax POST),构建​​ viewModel 以适应这些条款并不是那么明智(只是一个很难的意见,它非常适合您的场景)。
    猜你喜欢
    • 2014-12-15
    • 2014-01-26
    • 2017-08-10
    • 1970-01-01
    • 2013-11-21
    • 2012-08-26
    • 2018-08-23
    • 1970-01-01
    • 2012-04-05
    相关资源
    最近更新 更多