解决Html中的承诺价值 - > Ctrl - >工厂 - >延迟对象上的资源链

时间:2014-12-02 19:07:54

标签: javascript angularjs angular-promise

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})调用 - 那么所有渲染都很好。只是说所有变量都很好(没有拼写错误或其他东西)。

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。并以这种方式更新状态。这是我今天给自己的建议。