首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >角/ JavaScript自动水合物实例

角/ JavaScript自动水合物实例
EN

Stack Overflow用户
提问于 2015-12-18 01:27:43
回答 1查看 506关注 0票数 0

编辑

感谢Shaun Scovill的优雅回答

代码语言:javascript
运行
复制
    // create instance and inject server object - inside of the ChartService below
    var chart = new Chart(serverChartObject);

   // replace Chart factory with the following code to streamline the creation of the object constructor using the server object as well as hydrate it!

    Chart.$inject = [];
    function Chart() {

        return function(serverChartObject) {
            var keys = ['app_id', 'article_id', 'section_id', 'data', 'headline', 'legend', 'source', 'source_url', 'subtitle', 'summary', 'width', 'height'];
            _.assign(this, _.pick(serverChartObject, keys));
        };
    }

DEV工具

角: 1.4.7 RequireJS: 2.12 Laravel 5.1.x Lodash 3.10.1

问题:

我想知道是否有更好的方法来自动补充和保护AngularJS / JavaScript对象实例。

景物

在下面的示例中,我从Laravel5.1中获得了图表对象的集合,但在返回json对象时可能是任何后端。我有一个服务模块ChartService,然后将数据解析为JavaScript图表对象。

目标

使用最少的代码,我希望实现以下目标:

  1. 创建图表对象实例
  2. 使用服务器图表数据补充JS对象
  3. 保护对象数据属性或一个子集,如项目、app_id、section_id和数据

优先逼近

我使用了Object.defineProperty(Chart, 'app_id', { value: 1 });,并且在上面提到的受保护的方法上,但是如果我执行chart.app_id = 3,它会覆盖阻止所有属性被覆盖或修改的app_id和Object.freeze(chart)

电流逼近

注意:为了简洁起见,删除了很多代码,所以如果我删除了太多的上下文,就道歉了。

代码语言:javascript
运行
复制
define([
    'angular',
    'lodash'

], function(angular, _) {
    'use strict';

    ChartService.$inject = ['$http', '$q', '$sce', '$rootScope', 'api', 'Chart'];
    function ChartService($http, $q, $sce, $rootScope, api, Chart) {

        var chartService = {
            charts: [],
            // NOTE : call parse from external source
            parseCharts: function(items) {
                var self = this,
                    chart,
                    articleId = null,
                    sectionId = null;

                // NOTE : items are a collection of chart objects from Laravel
                if (angular.isDefined(items) && Object.keys(items).length > 0) {
                    // NOTE: c = chart server object
                    _.each(items, function(c,k) {
                        // factory Chart instance
                        chart = new Chart();
                        // NOTE : hydrate chart instance with c (server chart object data)
                        chart = hydrateInstance(c, chart);
                        // freeze object
                        Object.freeze(chart);
                    })
                }
            }
        };

        function hydrateInstance(obj, instance) {
            for (var prop in obj) {
                if (obj.hasOwnProperty(prop) && instance.hasOwnProperty(prop)) {
                    instance[prop] = obj[prop]
                }
            }
            return instance;
        }

        return chartService;
    }


    Chart.$inject = [];
    function Chart() {
        /**
         * Constructor, with class name
         */
        function Chart(app_id, article_id, section_id, data, headline, legend, source, source_url, subtitle, summary, width, height) {

            var self = this;
            self.app_id = app_id;
            self.article_id = article_id;
            self.section_id = section_id;
            self.data = data;
            self.headline = headline;
            self.legend = legend;
            self.source = source;
            self.source_url = source_url;
            self.subtitle = subtitle;
            self.summary = summary;
            self.width = width;
            self.height = height;
        }
        // removed rest of object / prototype properties for brevity sake

        return Chart;
    }


    return angular.module('cmo.content.charts', [

        ])
        // remove config for brevity
        .factory('Chart', Chart)
        .service('ChartService', ChartService);

});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-18 01:46:46

您可以使用两个交存函数(分配采摘)来缩短图表构造函数,如下所示:

代码语言:javascript
运行
复制
function Chart() {
    return function(config) {
        var keys = ['app_id', 'article_id', 'section_id', 'data', 'headline', 'legend', 'source', 'source_url', 'subtitle', 'summary', 'width', 'height'];
        _.assign(this, _.pick(config, keys));
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34347177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档