javascript - 用于跨不同位置访问数据的 Ember Utility 类

标签 javascript ember.js

我是 Ember 的新手,想要 Ember 中的实用程序类,它执行以下操作,接受 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;

我在哪里/如何编写这个 Utility 类,以便可以从不同的地方(比如从不同的路由)访问它?

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

在子路由中,我会进行 AJAX 调用,

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

最佳答案

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

简单的方法:将其作为一个方法包含在您的 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 服务类变得更 slim ,但引入了依赖项。您可以在构造函数中传递自己的 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;
};

关于javascript - 用于跨不同位置访问数据的 Ember Utility 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33302449/

相关文章:

javascript - 如何用元素包裹/包围突出显示的文本

Javascript Ajax 优雅降级,具有不同的页面?

ruby-on-rails - Ember.js 查找没有 ID 的单个项目

ember.js - 指定模板中 View 的操作?

javascript - 如何在express js中执行res.redirect时传递 header

javascript - JSDoc:模块和命名空间之间的关系是什么

javascript - 什么是低级 Javascript?

ember.js - ember-cli --proxy适用于GET,但在PUT和POST上失败

jquery - Cytoscape 在 Ember 中设置节点数据

ember.js - 如何使用 ember.js 中的缓存属性重新渲染模板?