javascript - Angular 工厂 $scope 变得无界
问题描述
我有一个工厂,它返回一个我想在前端显示的对象。当我如下设置变量时,有一些奇怪的行为(至少对我而言):
我在控制器的开头设置了一个变量“returnObject”,然后我在工厂输出的函数中分配它:
module.factory("MyFactory", function ($http, $timeout, $cookies) {
var returnObject = {};
var myFunction = function(response) {
// un-coomment this and it doesn't work
// var test = {1: 'test 2'};
// returnObject = test;
// this works
returnObject[1] = 'test';
}
var poller = function() {
$http.get('data.json').then(function(response) {
$timeout(poller, 5000);
myFunction(response);
});
return returnObject;
};
return {
unreadMessagePoller: poller,
};
});
app.controller('MainCtrl', MainCtrl);
function MainCtrl($scope, PollingService) {
// poll for unread messages
$scope.test = PollingService.unreadMessagePoller();
};
如果我在模板中输出 $scope 变量,我会看到预期的对象。但是,如果我取消注释以下行:
var test = {1: 'test 2'};
returnObject = test;
看来范围是未绑定的,前端输出是空的。我就是不明白!
我创建了一个 plunker 来演示这个问题。
https://plnkr.co/edit/feVaotKCE9w2uQLJ
更新:
这是另一个 plunker 不同的方法相同的行为,在我看来这是一个错误:
解决方案
$scope.test = PollingService.unreadMessagePoller();
返回原始对象var returnObject = {};
编码:
$http.get('data.json').then(function(response) {
returnObject[1] = 'test';
});
修改原始对象的内容。
另一方面,代码:
$http.get('data.json').then(function(response) {
var test = {1: 'test 2'};
returnObject = test;
});
用新的对象引用替换工厂中的对象引用。
由于控制器具有原始对象引用,因此它看不到更改的对象引用。
这就是 JavaScript 的工作方式。
坦率地说,当数据从服务器到达时,返回一个空对象然后填充内容的技术是我避免使用的技术。该技术在 AngularJS 的早期很流行,但现在更新的 API 返回 Promise,而不是会发生变异的空对象。
推荐阅读
- spring-boot - java.lang.ClassCastException 在 Wildfly 10 上部署 CAS 5.3.3 Maven 覆盖 WAR
- css - 您如何编写已在 SASS / SCSS 中声明的嵌套类的简写?
- javascript - 返回值中的生成器函数混淆
- django - 使用 django-environ 在 Django 中配置 Redis 缓存
- jquery - 无法访问数据表内容jquery
- c++ - 如何为多图的插入和擦除功能编写 API?
- java - RecyclerView 末尾的空白处
- rest - 如何保护基于 Firebase Cloud Functions 的 REST API
- html - 如何限制表单名称字段中的特殊字符、下划线、空格(输入标签)?
- asciidoctor - 无法使用 Asciidoctor pdf 渲染页脚