在edit.html
<div>timezone: {{userPreferencesCtrl.preference.response.format}}<div>
在UserPreferencesCtrl
this.preference = UserPreferencesFactory.userPreference;
在UserPreferencesFactory
基本上有两个休息电话。 Fist - 获取所有用户偏好,并在其成功时调用另一个休息呼叫 - 获得特定的用户偏好。
var factory = this;
factory.userPreference = $q.defer();
...
UserPreferencesResource.all().$promise.then(
function(data) {
// some code
if (foundRightGuy) {
// get preference by ID
UserPreferencesResource.get( {id: pref.preferenceID}).$promise.then(
function(data) {
factory.userPreference.resolve(data); // resolving the promise
}
);
}
}
);
return this; }]);
问题是在Controller端我看到了解决的承诺:
{"promise":{"$$state":{"status":1,"value":{"response":{"preferenceID":2,"user_name":"name3", "format":"keyvalue"}}}}}
在edit.html上没有呈现。
如何让它在屏幕上显示preference.response.format
值?
更新:(angularjs 1.3.x)
如果不是$q.defer();
而是UserPreferencesResource.get( {id: 2})
调用 - 那么所有渲染都很好。只是说所有变量都很好(没有拼写错误或其他东西)。
答案 0 :(得分:1)
调用UserPreferencesFactory.userPreference
时得到的是延迟对象,它具有作为属性的承诺。所以你必须解开这个承诺。
控制器:
this.preference;
UserPreferencesFactory
.userPreference
.promise
.then(function(data) {
this.preference = data;
});
答案 1 :(得分:0)
连接Ctr -> Factory -> Resource
链中数据的更好方法是:
在UserPreferencesCtrl
this.preference = UserPreferencesFactory.userPreference
因此无需引用promise
或执行then
。这是非常手工的方式。
然后在Factory
中,NO也需要执行任何$q.defer
或$q.resolve
。但相反,这可能就像这样简单:
factory.userPreference = {} // default value
UserPreferencesResource.all().then(function(data) {
//... may be more calls if we need it
angular.extend(factory.userPreference, data); // that part is important
})
angular.extend
- 将数据复制到退出的来源 - factory.userPreference
。这使得Ctrl看到更改/更新。否则,执行作业factory.userPreference = data
不会让Controller
这就是为什么在我尝试resolve/reject
手动避免直接赋值之前 - 让角度绑定在Controller和Factory之间起作用。但angular.extend
似乎更清洁的解决方案。
否则,除了样板编码之外,手动的做事方式(对我而言)在评估所有这些“公开承诺”时会导致问题:var promise = UserPreferenceFactory.userPreference.promise; + some other unexpected issues.
所以,如果你发现自己写了太多的承诺,请不要犹豫使用angular.extend
。并以这种方式更新状态。这是我今天给自己的建议。