【问题标题】:Knockout mapping options; map a JSON property to two view model properties淘汰赛映射选项;将 JSON 属性映射到两个视图模型属性
【发布时间】:2012-12-18 20:38:03
【问题描述】:

为了在将(可能)修改后的视图模型发布/保存回服务器时进行乐观并发检查,我想在一个单独的变量中获取原始值的副本,而不是我通过敲除绑定到的可观察变量绑定。

这可能与淘汰映射插件有关,还是在填充视图模型后我必须遍历映射的 observable 以获取副本?

【问题讨论】:

    标签: javascript knockout.js knockout-mapping-plugin optimistic-concurrency


    【解决方案1】:

    这个怎么样?

    function Task(data) {
        var self = this;
        self.title = ko.observable(data.title);
        self.origTitle = data.title;
        self.isDone = ko.observable(data.isDone);
        self.origIsDone = data.isDone;
    
        self.changes = ko.computed(function() {
            var changed = [];
    
            if (self.title() != self.origTitle) changed.push({ self.title(), self.origTitle });
            if (self.isDone() != self.origIsDone) changed.push({ self.isDone(), self.origIsDone });
            return changed;
        });
    }
    
    function TaskListViewModel() {
        // Data
        var self = this;
        self.tasks = ko.observableArray([]);
        self.newTaskText = ko.observable();
        self.changes = ko.computed(function() {
            var tasksToPost = ko.utils.arrayFilter(self.tasks(), function(task) { return task.changed().length > 0 });            
            $.ajax({
                type: 'POST',
                url: '/SomeUrl',
                data: tasksToPost 
            });
        });
    
        // Operations
        self.addTask = function() {
            self.tasks.push(new Task({ title: this.newTaskText() }));
            self.newTaskText("");
        };
        self.removeTask = function(task) { self.tasks.remove(task) };
    
        // Load initial state from server, convert it to Task instances, then populate self.tasks
        $.getJSON("/tasks", function(allData) {
            var mappedTasks = $.map(allData, function(item) { return new Task(item) });
            self.tasks(mappedTasks);
        });    
    }
    
    ko.applyBindings(new TaskListViewModel());
    

    【讨论】:

    • 谢谢,但这不是我要找的;我需要检测单个值的变化 - 而不是数组。
    • 再次查看您的问题,您将它们保留在单独变量中的原因是什么?这是为了确定用户是否单独更改了该页面上的任何内容?如果您使用或不使用映射器,将涉及某种迭代
    • 是的,我想 a) 只提交更改后的值,而且 b) 将新旧值配对,以便我可以在服务器端进行乐观并发检查。
    • 我有一个思考,我可能会为每个属性添加一个额外的普通变量来保存原始值。在此之后创建一个计算变量,该变量将仅返回与其旧属性并排更改的属性。这有意义吗?您可以在回发到服务器时使用该计算变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2015-07-16
    • 2012-11-12
    • 2012-04-27
    相关资源
    最近更新 更多