Javascript 缓存数据和数据绑定-AngularJs
我只是想弄清楚如何构造这个 我有一些组件都需要相同的数据。因此,我定义了一个服务(.factory),它提供对该数据的访问。但是,如果我需要更新数据,我会破坏所有绑定 我的plunkr失败了(你知道我错过了什么吗?),但你可以从下面的代码中看出我的意思:Javascript 缓存数据和数据绑定-AngularJs,javascript,angularjs,Javascript,Angularjs,我只是想弄清楚如何构造这个 我有一些组件都需要相同的数据。因此,我定义了一个服务(.factory),它提供对该数据的访问。但是,如果我需要更新数据,我会破坏所有绑定 我的plunkr失败了(你知道我错过了什么吗?),但你可以从下面的代码中看出我的意思: var app = angular.module("app", []); app.factory("userState", function($scope) { $scope.settings = {}; $scope.update
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中的两个问题:
ng app=“app”
话虽如此,应该澄清的是,在工厂或服务中使用
scope
单例是为了方便设置属性或调用表单/控制器中的方法。数据应该存储在单例中的私有变量中,而不是范围
。上面更新的plunker可以快速解决您的问题。在现实世界的应用程序中,$scope
应存储在数组中,并在使用以下方法销毁作用域时将其删除:
作用域。$on(“$destroy”,函数(){…})
下面是一个示例警报服务,演示了在服务中使用$scope
:
您的plunker中有几个问题:
ng app=“app”
话虽如此,应该澄清的是,在工厂或服务中使用
scope
单例是为了方便设置属性或调用表单/控制器中的方法。数据应该存储在单例中的私有变量中,而不是范围
。上面更新的plunker可以快速解决您的问题。在现实世界的应用程序中,$scope
应存储在数组中,并在使用以下方法销毁作用域时将其删除:
作用域。$on(“$destroy”,函数(){…})
下面是一个示例警报服务,演示了在服务中使用$scope
:
您的plunker中有几个问题:
ng app=“app”
话虽如此,应该澄清的是,在工厂或服务中使用
scope
单例是为了方便设置属性或调用表单/控制器中的方法。数据应该存储在单例中的私有变量中,而不是范围
。上面更新的plunker可以快速解决您的问题。在现实世界的应用程序中,$scope
应存储在数组中,并在使用以下方法销毁作用域时将其删除:
作用域。$on(“$destroy”,函数(){…})
下面是一个示例警报服务,演示了在服务中使用$scope
:
您的plunker中有几个问题:
ng app=“app”
话虽如此,应该澄清的是,在工厂或服务中使用
scope
单例是为了方便设置属性或调用表单/控制器中的方法。数据应该存储在单例中的私有变量中,而不是范围
。上面更新的plunker可以快速解决您的问题。在真实世界的应用程序中,