【问题标题】:knockou.js getting model from server mapping with mapping plugin and sending the model backknockout.js 使用映射插件从服务器映射中获取模型并将模型发回
【发布时间】:2012-06-14 14:05:03
【问题描述】:

我开始使用 knockout.js,我真的很喜欢它。 我使用 ASP.Net mvc、jQuery 和 knockout.js

我的问题是: 假设我有一个用户的管理屏幕,用户是我的视图模型 在用户内部我想要一个权限数组

我的用户视图模型:

var userViewModelClass = function () {
   var self = this;
   ko.mapping.fromJS({
       ID: "",
       permissions: []
   }, {}, self);
}

现在.. 如果我向服务器发出 ajax 请求并返回 JSON,我使用映射插件,一切都按预期进行

但是...现在我希望我呈现的权限列表具有删除之类的操作。 所以我需要一个权限对象,然后权限数组将是权限对象数组。但我该怎么做?映射插件如何知道从服务器返回给他的数组中的对象实际上是在这样的对象上:

 function permission() {
   var self = this;
   this.delete = function () {       
   };
   ko.mapping.fromJS({
       name: "",
       level: ""
    }, {}, self);
}

这是我问题的第一部分。 第二部分: 假设我得到了具有所有权限数组的模型,它们都是这个权限对象。现在我希望我视图中的每个删除按钮都绑定权限对象内的删除功能。 使用:

data-bind="click: delete"

删除功能的最佳实现是什么?我想到了类似的事情:对服务器进行ajax调用,这实际上会删除用户的权限。然后如果调用成功从可观察数组中删除当前权限,则视图将更新... 这是一个好习惯吗?

谢谢!

【问题讨论】:

    标签: asp.net-mvc knockout.js knockout-mapping-plugin


    【解决方案1】:

    第一部分。您需要使用映射选项。在您的userViewModelClass 中执行此操作。

    var userViewModelClass = function () {
       var self = this;
       ko.mapping.fromJS({
           ID: "",
           permissions: []
       }, {
           permissions: {
               create: function(options) {
                   return new permission(options.data);
               }
           }
       }, self);
    }
    

    然后像这样修改你的权限对象

    function permission(config) {
       var self = this;
       this.delete = function () {       
       };
       ko.mapping.fromJS($.extend({
           name: "",
           level: ""
        }, config), {}, self);
    }
    

    请注意,我添加了扩展,以便您的默认结构将保留并被传入数据覆盖。

    您问题的第二部分。一种可能的方法是在构造函数中传递对父级的引用。所以上面的映射选项会变成

    permissions: {
        create: function(options) {
            return new permission(options.data, self);
        }
    }
    

    那么你的删除可能是这样的。

    this.delete = function () {  
        $.ajax(deleteurl, yourdata, function(result) {
           // success
           parent.permissions.remove(self);
        }, function() {
           // failure
           display error message
        }     
    };
    

    编辑

    在 cmets 中讨论的替代方式。

    var userViewModelClass = function () {
       var self = this;
       ko.mapping.fromJS({
           ID: "",
           permissions: []
       }, {
           permissions: {
               create: function(options) {
                   return new permission(options.data);
               }
           }
       }, self);
    
       this.delete = function(permission) {
           self.permissions.remove(permission);
       };
    }
    
    data-bind="click: $parent.delete"
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢你很快就会尝试并回到这里:),我理解第一部分,它看起来不错。但我不喜欢第二部分..想一想你有一个包含一个对象的对象,而第二个对象将引用它的父亲?...然后你有这一行:parent.permissions.remove(self );你去父母那里,然后去你所在的收藏,然后删除你自己。对我来说似乎很奇怪..我知道它会起作用,但它仍然很奇怪。我认为它缺少的是事件
    • 我只是向您展示了一种使用普通 js 的方法,就像您布置它的方式一样。在我看来,删除实际上应该是父母而不是孩子的成员。所以你的删除方法应该在 userViewModel 类上。在这个微不足道的场景中,事件过于复杂。
    • 非常感谢!不知道这一点:$parent.delete 是的,这肯定回答了我的问题,而且看起来也很棒。谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2019-01-22
    相关资源
    最近更新 更多