【问题标题】:How can I aggregate when I'm mapping in KnockoutJS?在 KnockoutJS 中映射时如何聚合?
【发布时间】:2013-12-22 16:22:27
【问题描述】:

我已经使用 KnockoutJS 工作了几天,我刚刚遇到了一个我无法解决的简单问题! 我有一个这样的模型:

function Contact() {
        var self = this;
        self.name = ko.observable("");
        self.phones = ko.observableArray([]);
        self.faxes = ko.observableArray([]);
        self.address = ko.observable("");
}

如果每个联系人包含多个电话或传真,我必须调用将返回重复行的服务。例如:

{{"name":"Name1","phone":"1234","fax":"5654","address":"abc"},{{"name":"Name1","phone":"2323","fax":"8787","address":"abc"}}

我像这样调用服务器:

self.GetContacts = function () {
        $.getJSON(self.queryUrl(),
        function (data) {
            if (data.results) {
                self.contacts(ko.toJS(data.results));
            }
        });

没有办法在服务器端聚合它,因为它是一个开箱即用的工具,唯一可能的方法是在客户端聚合它。

如何在绑定它们之前使用我的自定义模型聚合它们?

【问题讨论】:

    标签: json rest data-binding knockout.js


    【解决方案1】:

    我会做这样的事情:

    function aggragateContacts(data) {
        var contacts = [];
        ko.utils.arrayForEach(data, function (contactData) {
            // looking an existing contact with the same name and address
            var contact = ko.utils.arrayFirst(contacts, function (c) {
                return c.name() == contactData.name && c.address() == contactData.address;
            });
            // otherwise create one 
            if (contact == null) {
                contact = new Contact();
                contact.name(contactData.name);
                contact.address(contactData.address);
                contacts.push(contact);
            }
            contact.phones.push(contactData.phone);
            contact.fax.push(contactData.fax);
        });
    }
    
    
    self.GetContacts = function () {
        $.getJSON(self.queryUrl(),
    
        function (data) {
            if (data.results) {
                self.contacts(aggragateContacts(ko.toJS(data.results)));
            }
        })
    }
    

    【讨论】:

    • 看起来KnockoutJS中隐藏的宝藏很多。万达达米安!我马上去试试!
    猜你喜欢
    • 2012-12-26
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2020-03-19
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多