AngularJS:rootScope对象自动保存

时间:2015-12-08 11:17:38

标签: javascript angularjs

我目前正在开发一种HTML预览器。 我正在开发一种新功能来自动保存最近的修改。

我有一个函数返回一个包含我要保存的数据的对象

import os
import subprocess

base = 'C:\\data'
jupyter_dir = os.path.join(base,'.jupyter')
if not os.path.exists(jupyter_dir):
  os.mkdir(jupyter_dir)

dirs = {'JUPYTER_CONFIG_DIR' : jupyter_dir, 'JUPYTER_RUNTIME_DIR' : os.path.join(jupyter_dir,'runtime'),'JUPYTER_DATA_DIR' : os.path.join(jupyter_dir,'data')}

for k,v in dirs.iteritems():
  if not os.path.exists(v):
    os.mkdir(v)
  os.environ[k] = v

ipython_dir = os.path.join(base,'.ipython')

os.environ['IPYTHONDIR'] = ipython_dir

subprocess.call(['C:\\Python27\\Scripts\\jupyter-notebook.exe'])

另一个函数(此处缩短),每隔X秒将此对象保存到另一个对象中。

var saveSkin = function(){
 var saveObj = {
    "name" : $rootScope.skin.name,
  "type": $rootScope.type,
   "skin" : {
     "name" : $rootScope.skin.name,
     "td" : $rootScope.skin.td,
     "client" : $rootScope.skin.client,
     "aid" : $rootScope.skin.aid
   },
   "skinSettings" : {
     "bgUrl" : $rootScope.skinSettings.bgUrl,
     "bgColor" : $rootScope.skinSettings.bgColor,
     "bannerHeight" : $rootScope.skinSettings.bannerHeight
   },
   "components" : $rootScope.components,
   "exportCss" : $rootScope.exportCss,
   "exportJs" : $rootScope.exportJs
 };
 return saveObj;
};

问题是父对象内的所有对象都具有相同的值,比如每个对象是否使用rootScope值自动更新,而我希望它们保留rootScope的创建时刻。

如果您对如何解决这个问题有任何想法,我将非常感激。 谢谢,阿德里安

3 个答案:

答案 0 :(得分:1)

您的对象在不调用saveSkin()的情况下更改,可能是因为您在那里使用的所有属性都不是value type,其中一些属性是指向对象的指针。

所以,就我所见,你有两个选择:

1)仅保存saveObj

中的值类型

2)每次更新时都克隆对象,最简单的方法是(效率不高)

$scope.savedObject = JSON.parse(JSON.stringify(saveObj));

答案 1 :(得分:0)

也许你可以尝试这样的事情:

var saveSkin = function (skin, type, skinSettings, components, exportCss, exportJs) {
    return {
        "name": skin.name,
        "type": type,
        "skin": {
            "name": skin.name,
            "td": skin.td,
            "client": skin.client,
            "aid": skin.aid
        },
        "skinSettings": {
            "bgUrl": skinSettings.bgUrl,
            "bgColor": skinSettings.bgColor,
            "bannerHeight": skinSettings.bannerHeight
        },
        "components": components,
        "exportCss": exportCss,
        "exportJs": exportJs
    };
};

而不是这样称呼:

var autoSave = function () {
    $interval(function () {
        creativeSave.push(saveSkin($rootScope.skin, $rootScope.type, $rootScope.skinSettings, $rootScope.components, $rootScope.exportCss, $rootScope.exportJs));
    }, 3000);
};

也许那时甚至可以将$rootScope更改为$scope

答案 2 :(得分:0)

我不完全明白你想要什么,但是,这可能会对你有所帮助。这里当我们使用$ rootScope。$ watch这样会在每次rootScope更改时执行。

    $rootScope.$watch(function(data){
         creativeSave.push(saveSkin());
    });