Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 缓存数据和数据绑定-AngularJs_Javascript_Angularjs - Fatal编程技术网

Javascript 缓存数据和数据绑定-AngularJs

Javascript 缓存数据和数据绑定-AngularJs,javascript,angularjs,Javascript,Angularjs,我只是想弄清楚如何构造这个 我有一些组件都需要相同的数据。因此,我定义了一个服务(.factory),它提供对该数据的访问。但是,如果我需要更新数据,我会破坏所有绑定 我的plunkr失败了(你知道我错过了什么吗?),但你可以从下面的代码中看出我的意思: var app = angular.module("app", []); app.factory("userState", function($scope) { $scope.settings = {}; $scope.update

我只是想弄清楚如何构造这个

我有一些组件都需要相同的数据。因此,我定义了一个服务(.factory),它提供对该数据的访问。但是,如果我需要更新数据,我会破坏所有绑定

我的plunkr失败了(你知道我错过了什么吗?),但你可以从下面的代码中看出我的意思:

var app = angular.module("app", []);
app.factory("userState", function($scope)
{
  $scope.settings = {};

  $scope.update = function(data)
  {
    $scope.settings = data;
  };

  return {
            getSettings: function(){
                return $scope.settings;
            },
            updateData: function(data){
              $scope.update(data);
            },
            initialise: function(){
              var simulatingTheFirstAjaxCall = {};
              simulatingTheFirstAjaxCall.property = "hello world!";
              $scope.update(simulatingTheFirstAjaxCall);
            }
         };
});
app.controller("IndexController", function($scope, userState)
{
  userState.initialise();
  $scope.settings = userState.getSettings();

  $scope.simulateSecondAjaxCall = function()
  {
    var object = {};
    object.property = "goodbye world";
    userState.updateData(object);
  };
});
我脑子里有几个解决办法,但没有一个是令人满意的。动态复制属性可能会遇到问题(数组、日期、自定义对象等),让所有组件自己查询数据源非常容易聊天,直接绑定到服务会让人感觉不对。也许我应该总是返回一个具有.data属性的对象,这是我唯一要更改的。。。。。idk看起来很傻,好像我错过了一些基本的东西


我很想制作某种动态属性装饰器($scope.settings.internal=data;),但我不确定这是否可行。

我认为您的问题是,您在工厂内使用了
$scope
,这没有意义,您不应该这样做。相反,吃点这样的东西

app.factory('userState', [function(){
   return {
      setting1: true,
      setting2: false
   }
}]);

app.controller('myCtrl', ['$scope', 'userState', function($scope, userState){
   $scope.userState=userState;
   $scope.updateSettings= function(){
      //e.g. change one setting to false, will also update factory value
      $scope.userState.setting1=false;
   }
}]);

因为在JavaScript中,非基本对象是通过引用传递的,所以您可以更改
$scope.userState
,它也会更改您的工厂。

我认为您的问题是您在工厂内使用
$scope
,这没有意义,您不应该这样做。相反,吃点这样的东西

app.factory('userState', [function(){
   return {
      setting1: true,
      setting2: false
   }
}]);

app.controller('myCtrl', ['$scope', 'userState', function($scope, userState){
   $scope.userState=userState;
   $scope.updateSettings= function(){
      //e.g. change one setting to false, will also update factory value
      $scope.userState.setting1=false;
   }
}]);

因为在JavaScript中,非基本对象是通过引用传递的,所以您可以更改
$scope.userState
,它也会更改您的工厂。

我认为您的问题是您在工厂内使用
$scope
,这没有意义,您不应该这样做。相反,吃点这样的东西

app.factory('userState', [function(){
   return {
      setting1: true,
      setting2: false
   }
}]);

app.controller('myCtrl', ['$scope', 'userState', function($scope, userState){
   $scope.userState=userState;
   $scope.updateSettings= function(){
      //e.g. change one setting to false, will also update factory value
      $scope.userState.setting1=false;
   }
}]);

因为在JavaScript中,非基本对象是通过引用传递的,所以您可以更改
$scope.userState
,它也会更改您的工厂。

我认为您的问题是您在工厂内使用
$scope
,这没有意义,您不应该这样做。相反,吃点这样的东西

app.factory('userState', [function(){
   return {
      setting1: true,
      setting2: false
   }
}]);

app.controller('myCtrl', ['$scope', 'userState', function($scope, userState){
   $scope.userState=userState;
   $scope.updateSettings= function(){
      //e.g. change one setting to false, will also update factory value
      $scope.userState.setting1=false;
   }
}]);

由于在JavaScript中,非原语对象是通过引用传递的,因此您可以更改
$scope.userState
,它还将更改您的工厂。

plunker中的两个问题:

  • 您正在工厂中引用$scope,它不会被注入。如果必须使用$scope,请在初始化期间传递它
  • 您不是在引导:您需要在index.html中添加
    ng app=“app”
  • 以下是您的plunker的修改工作版本:

    话虽如此,应该澄清的是,在工厂或服务中使用
    scope
    单例是为了方便设置属性或调用表单/控制器中的方法。数据应该存储在单例中的私有变量中,而不是
    范围
    。上面更新的plunker可以快速解决您的问题。在现实世界的应用程序中,
    $scope
    应存储在数组中,并在使用以下方法销毁作用域时将其删除:

    
    作用域。$on(“$destroy”,函数(){…})
    

    下面是一个示例警报服务,演示了在服务中使用
    $scope

    您的plunker中有几个问题:

  • 您正在工厂中引用$scope,它不会被注入。如果必须使用$scope,请在初始化期间传递它
  • 您不是在引导:您需要在index.html中添加
    ng app=“app”
  • 以下是您的plunker的修改工作版本:

    话虽如此,应该澄清的是,在工厂或服务中使用
    scope
    单例是为了方便设置属性或调用表单/控制器中的方法。数据应该存储在单例中的私有变量中,而不是
    范围
    。上面更新的plunker可以快速解决您的问题。在现实世界的应用程序中,
    $scope
    应存储在数组中,并在使用以下方法销毁作用域时将其删除:

    
    作用域。$on(“$destroy”,函数(){…})
    

    下面是一个示例警报服务,演示了在服务中使用
    $scope

    您的plunker中有几个问题:

  • 您正在工厂中引用$scope,它不会被注入。如果必须使用$scope,请在初始化期间传递它
  • 您不是在引导:您需要在index.html中添加
    ng app=“app”
  • 以下是您的plunker的修改工作版本:

    话虽如此,应该澄清的是,在工厂或服务中使用
    scope
    单例是为了方便设置属性或调用表单/控制器中的方法。数据应该存储在单例中的私有变量中,而不是
    范围
    。上面更新的plunker可以快速解决您的问题。在现实世界的应用程序中,
    $scope
    应存储在数组中,并在使用以下方法销毁作用域时将其删除:

    
    作用域。$on(“$destroy”,函数(){…})
    

    下面是一个示例警报服务,演示了在服务中使用
    $scope

    您的plunker中有几个问题:

  • 您正在工厂中引用$scope,它不会被注入。如果必须使用$scope,请在初始化期间传递它
  • 您不是在引导:您需要在index.html中添加
    ng app=“app”
  • 以下是您的plunker的修改工作版本:

    话虽如此,应该澄清的是,在工厂或服务中使用
    scope
    单例是为了方便设置属性或调用表单/控制器中的方法。数据应该存储在单例中的私有变量中,而不是
    范围
    。上面更新的plunker可以快速解决您的问题。在真实世界的应用程序中,