【问题标题】:Unset object property取消设置对象属性
【发布时间】:2013-07-17 12:18:53
【问题描述】:

我有一个提供者:

AdviceList.provider('$adviceList',function(){
    this.$get = function ($rootScope,$document,$compile,$http,$purr){

        function AdviceList(){

          $http.post('../sys/core/fetchTreatments.php').success(function(data,status){
                this.treatments = data;
                console.log(this.treatments); // the correct object
            });

            this.adviceCategories = [
                // available in the controller
            ];

        }
        return{

            AdviceList: function(){
                return new AdviceList();
            }
        }
    }
});

此外,我有这个控制器:

AdviceList.controller('AdviceListCtrl',function($scope,$adviceList){
    var adv = $adviceList.AdviceList();
    $scope.treatments = adv.treatments; // undefined
});

为什么控制器的$scope.treatments 保持未定义,但提供程序内部的this.treatments 填充正确?此外,adviceCategories 在我的控制器中可用。

【问题讨论】:

    标签: javascript oop object angularjs


    【解决方案1】:

    您收到的调用本质上是异步的,因此当您尝试分配它们时,结果可能尚未填充。

    所以这里

    var adv = $adviceList.AdviceList();
    $scope.treatments = adv.treatments;  //The treatments would only get filled after the server call is over.
    

    您需要重写代码,将其分配给成功回调的范围属性。

    【讨论】:

    • 谢谢。如果您碰巧有一个简单示例,您介意分享一个相关链接吗?
    【解决方案2】:

    我会建议你简化你的代码

    1) 使用 angular 的简单工厂方法而不是提供者

    2) 返回一个承诺以避免使用回调

     AdviceList.service('adviceList', function ($http) {
                return {
                    adviceList: function () {
                        return $http.post('../sys/core/fetchTreatments.php');
                    }
                }
            });
    
            AdviceList.controller('AdviceListCtrl', function ($scope, $adviceList) {
                adviceList.AdviceList().then(function (data) {
                    $scope.treatments = data //set value to data when data is recieved from server
                });
    
            });
    

    【讨论】:

    • 谢谢。除了语法不太复杂之外,您能否简要解释一下选择服务而不是提供者的好处?我会认为使用提供程序总是一个好主意,因为它们是可配置的。
    • 提供者和服务是相似的,你可以使用任何。这里的主要问题不是提供者与服务,而是处理调用的异步性质。 @Ajay 的建议就像魅力一样。您可以查看这个 SO question 以了解差异stackoverflow.com/questions/15666048/…
    猜你喜欢
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 2013-06-12
    • 2011-09-23
    相关资源
    最近更新 更多