- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试重构一个应用程序,该应用程序一直在使用 Ajax 获取一些服务器数据,然后将其附加到 $rootScope
以便在引导应用程序之前获取 Controller 和服务,我一直在尝试使用 $q
plnkr: http://plnkr.co/edit/22yQUlyE9nbQ0WVjxWxY
在那个 plnkr 中,我试图让服务返回一些数据供一些 Controller 使用。
app.service('data', function($q, $window, $timeout) {
var promise = $q.defer();
promise.promise.foo = 'Dang!';
$timeout(function() {
console.log('resolve promise');
promise.resolve({
foo: 'bar',
baz: 'zot'
});
}, 1000);
console.log('return promise');
return promise.promise
});
我正在像这样使用 $routeProvider 的 resolve-property
app.config(function($routeProvider) {
$routeProvider.when('/', {
controller: 'MainController',
templateUrl: 'data.html',
resolve: {
data: 'data'
}
});
});
但是,当我尝试在我的一个 Controller 中将已解决 promise 的“foo”属性分配给 $scope 时,它就出错了。
app.controller('MainController', function($scope, data) {
$scope.main = data.foo;
});
app.controller('Controller1', function($scope, data) {
$scope.controller1 = data;
});
$scope
在 promise 解析时不会更新,实际 promise 对象的 foo
属性最终在 $scope
上作为可以在http://plnkr.co/edit/22yQUlyE9nbQ0WVjxWxY?p=preview上看到
那么我是否正在做一些我绝对不应该在这里做的事情,通过将 promise 的属性分配给 $scope
?我的印象是路由的 resolve-property 意味着在 promise 被解决之前,什么都不应该被初始化。
最佳答案
看起来发生的事情是时间问题。实例化服务时,它会设置超时。然后将 Controller 实例化,将 $scope.main
设置为 data
的属性,但不设置为 data
引用的对象。
当您将此嵌套属性分配给另一个引用时,您将失去跟踪父引用更改的能力,因为对该属性的此引用将始终指向旧值。当您在 Controller1
中引用同一对象 (data
) 时,您不会遇到此问题,因为引用所指向的对象的属性只是被覆盖了。如果 resolve 方法正在将新对象写入数据,从而更改引用,您会看到同样的问题。
分为几个步骤:
1) 数据服务被实例化并返回一个对象,该对象具有单个属性 foo
,指向一个值为 Dang!
的字符串对象。
2) MainController 被实例化,并将作用域的 main
属性设置为数据服务的 foo 属性中保存的对象。这是重要的部分,因为主要属性只知道对象 Dang!
。
此外,Controller1 被实例化并将作用域的 controller1
属性设置为作为数据服务的对象。
3) 计时器触发并将数据对象的属性覆盖为其他一些属性。由于 data
中的对象未被替换,controller1
可以看到每个属性的新值。由于 main
指向包含值 Dang!
的对象,因此它没有任何变化。如果它引用的对象的值发生变化,它只会注意到变化,并且由于 javascript 中的字符串值是不可变的,因此它无法改变。
要解决您的情况,如果您希望范围的属性随着服务的变化而变化,您需要绑定(bind)到您的服务并在表达式中引用这些属性。
关于javascript - Angular .js : Is it not possible to assign properties of a resolved promise to $scope?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16811767/
在嵌入式系统的背景下,给出以下函数结构: 返回变量的条件赋值: int foo(int x) { int status; if (is_valid(x)) {
#input |--IDs-|--Value-| |--da1-|--100---| |--da2-|---80---| |--da3-|--200---| |--da4-|--300---| |--
您可以declare a list of variables and assign them some value在 Perl 6 my ($a, $b) = 33,44 # $a will be 3
在下面的代码中实现对象的浅拷贝,但是不同的输出让我很困惑: 对象.分配: var obj = { name: 'wsscat', age: 0, add: { a: 'beijin
我正在查看一位已不复存在的开发人员的一些旧代码,并注意到有时他使用 Object.assign({}, xyz) 还有他用过的其他东西 Object.assign([], abc); 两者有区别吗?
这个问题在这里已经有了答案: Why were ES5 Object methods not added to Object.prototype? (2 个答案) 关闭 4 个月前。 我正在做一个
我想知道这之间的区别: Object.assign(otherObject, { someNewProperty: '' }); 和 otherObject.someNewProperty = '
考虑以下代码: const defaultState = () => { return { profile: { id: '', displayName: '',
我刚刚偶然发现this line of TS code : const { title = item.text } = item; 这似乎是一个destructuring assigment但是大括号
我是一个没有经验的 JavaScript 用户,正在阅读这本书 CoffeeScript: Accelerated JavaScript Development ,其中作者制作了一种 Scrabble
当我查看日志文件时 D:\SAS\XXX\Lev1\SASMain\BatchServer\Logs 我看到了这两行 NOTE: Libref TESTLIB successfully assigne
我似乎不明白为什么要使用移动赋值运算符: CLASSA & operator=(CLASSA && other); //move assignment operator 结束了,复制赋值运算符: CL
在Eiffel Studio中,我一直试图访问从另一个类定义的一个类的对象的字段。但是,它不断给出我无法理解和解决的错误。以下是示例代码片段: 创建对象的类: class TEST1 feat
为什么这个片段在 Node (10.5) .then(function() { this = {...this, ...payload}; this.update();
我在我的 React 应用程序中使用以下包来生成 Recaptcha 组件:https://github.com/appleboy/react-recaptcha 组件如下所示,带有 eslint 警
我有以下代码: #include #include using std::cout; struct SomeType { SomeType() {} SomeType(const Some
我有这个代码示例: var a = 10; ({a}) = 0; 在 Google Chrome 中,它显示错误:SyntaxError:无效的解构赋值目标 在 Firefox 中,它显示错误:Ref
我有一个函数,用于对两个输入字段的输入求和并将其分配给一个。我的函数如下所示: function sum(id) { nextId = id+2 console.log
我收到这个警告 "Automatic Reference Counting Issue: Assigning retained object to unsafe_unretained variable
在使用 Shopify 的 Liquid 语言编码时,我注意到使用以下语法分配了一些变量: {%- assign variable = value -%} 和使用以下语法分配的其他变量: {% ass
我是一名优秀的程序员,十分优秀!