簡體   English   中英

Ember 實用程序類,用於跨不同地方訪問數據

[英]Ember Utility class for accessing data across different places

我是 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;

我在哪里/如何編寫這個實用程序類,以便可以從不同的地方(比如從不同的路徑)訪問它?

補充一點,我想在子路由(某些工作流的一部分)中使用 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 服務類變得更精簡,但引入了依賴項。 您可以在構造函數中傳遞您自己的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;
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM