Ember Utility类,用于跨不同位置访问数据

时间:2015-10-23 12:32:48

标签: javascript ember.js

我是Ember的新手,想在Ember中使用一个Utility类来执行以下操作,接受rowItems并返回一个对象(finalMeta)

var myMeta1 = new Array();
var myMeta2 = new Array();

dojo.forEach(rowItems, dojo.hitch(this, function(rowItem){

    var metaData = {
            Id: rowItem.Id,
            version: rowItem.version
    };

    if(rowItem.tranMetaData.tpl){
        myMeta2.push(metaData);
    }else{
        myMeta1.push(metaData);
    }
}));

if(myMeta1.length == 0){
    myMeta1 = null;
}

if(myMeta2.length == 0){
    myMeta2 =  null;
}

var finalMeta = {
    "myMeta1": myMeta1,
    "myMeta2": myMeta2
};

return finalMeta;

在哪里/如何编写此实用程序类,以便可以从其他位置(例如从不同的路径)访问它?

添加,我想在子路由(某些工作流程的一部分)中使用finalMeta作为输入/请求某些API的参数。

在子路线中,我会进行AJAX通话,

Ember.$.ajax({
                    url: someUrl,
                    type: "POST",
                    data: JSON.stringify({
                        'ids': idKeys,
'metaData': finalMeta
                    }),
    })

1 个答案:

答案 0 :(得分:1)

我想到了两个解决方案。第一个可能是最简单的实现。第二个可能在技术上更加面向对象,但引入了另一个目的非常有限的类。

简单方法:将其作为API服务对象中的方法包括在内:

function SomeApiService() {
}

SomeApiService.prototype = {
    constructor: SomeApiService,

    saveSomething: function(rows) {
        var finalMeta = this.getMetaData(rows);
        var idKeys = // create array of id keys

        Ember.$.ajax({
            url: someUrl,
            type: "POST",
            data: JSON.stringify({
                'ids': idKeys,
                'metaData': finalMeta
            }),
        });
    },

    doSomethingElse: function(rows) {
        var finalMeta = this.getMetaData(rows);

        Ember.$.ajax({
            ...,
            data: JSON.stringify({
                metaData: finalMeta
            })
        });
    },

    getMetaData: function(rowItems) {
        var myMeta1 = [];
        var myMeta2 = [];

        dojo.forEach(rowItems, dojo.hitch(this, function(rowItem){

            var metaData = {
                    Id: rowItem.Id,
                    version: rowItem.version
            };

            if(rowItem.tranMetaData.tpl){
                myMeta2.push(metaData);
            }else{
                myMeta1.push(metaData);
            }
        }));

        if(myMeta1.length == 0){
            myMeta1 = null;
        }

        if(myMeta2.length == 0){
            myMeta2 =  null;
        }

        var finalMeta = {
            "myMeta1": myMeta1,
            "myMeta2": myMeta2
        };

        return finalMeta;
    }
};

或者,将其转换为自己的帮助程序类,并让API服务类使用它:

您的API服务类变得更加苗条,但引入了依赖关系。您可以在构造函数中传递自己的metaHelper并提供用于测试的模拟对象,但它可以默认为新的MetaDataHelper对象。

function SomeApiService(metaHelper) {
    this.metaHelper = metaHelper || new MetaDataHelper();
}

SomeApiService.prototype = {
    constructor: SomeApiService,

    saveSomething: function(rows) {
        var finalMeta = this.metaHelper.getMetaData(rows);
        var idKeys = // create array of id keys

        Ember.$.ajax({
            url: someUrl,
            type: "POST",
            data: JSON.stringify({
                'ids': idKeys,
                'metaData': finalMeta
            }),
        });
    },

    doSomethingElse: function(rows) {
        var finalMeta = this.metaHelper.getMetaData(rows);

        Ember.$.ajax({
            ...,
            data: JSON.stringify({
                metaData: finalMeta
            })
        });
    }
};

此时MetaDataHelper类并不包含太多内容,但是您将分离您的关注点并使元数据帮助程序对象可以自行测试。这也允许您编写使用MetaDataHelper对象的其他API服务类,以防止复制此逻辑。

function MetaDataHelper() {
}

MetaDataHelper.prototype.getMetaData = function(rowItems) {
        var myMeta1 = [];
        var myMeta2 = [];

        dojo.forEach(rowItems, dojo.hitch(this, function(rowItem){

            var metaData = {
                    Id: rowItem.Id,
                    version: rowItem.version
            };

            if(rowItem.tranMetaData.tpl){
                myMeta2.push(metaData);
            }else{
                myMeta1.push(metaData);
            }
        }));

        if(myMeta1.length == 0){
            myMeta1 = null;
        }

        if(myMeta2.length == 0){
            myMeta2 =  null;
        }

        var finalMeta = {
            "myMeta1": myMeta1,
            "myMeta2": myMeta2
        };

        return finalMeta;
};