使用Parse.Cloud.run()进行ng-repeat绑定分解

时间:2015-06-02 15:08:40

标签: angularjs data-binding parse-platform angularjs-ng-repeat

总结问题:

  • 使用AngularJS 1.3.15
  • 使用Parse.com库1.4.2
  • 屏幕绑定到我的控制器的输出未更新,当基础结构更新时

我的HTML很简单 - 我使用ng-repeat从控制器中的数组输出字符:

<body ng-controller="MainCtrl as main">

    <div ng-repeat="char in main.chars">
        {{char}}
    </div>
</body>

要填充此数组,我有2个工厂服务。

  • httpFactory使用$http.get(...)
  • 从本地JSON文件中读取
  • parseFactory使用Parse.Cloud.run(...)
  • 从Parse Cloud Code中读取
  • 他们基本上是相同的

这两个都是成功的,并使用Promise公开结果,即.then(...)

app.factory('httpFactory', function($http) {
    return {
        getArray: function () {
            return $http.get('/data/beaches.json').then(
                function(response){
                    var array = ["Y", "e", "s"];
                    return array;
                });
        }
    };
});

app.factory('parseFactory', function() {
    return {
        getArray: function () {
            return Parse.Cloud.run('hello').then(
                function(response){
                    console.log(response);
                    var array = ["N", "o"];
                    return array;
                });
        }
    };
});

请注意,在此示例中,我将在promises中返回硬编码值,以排除Web服务本身的任何问题。

Parse Cloud功能没什么特别之处。它来自基本模板 - 函数hello正确返回预期的“Hello,world!”。

我的控制器MainCtrl非常简单。我使用初始值实例化chars数组。

我依次调用每个工厂服务,使用返回值更新我的chars数组,我在更新后注销。

httpFactory.getArray()的调用,因为这与预期完全一致:

  • chars数组已正确更新
  • 绑定HTML显示更改(从“Init”到“是”)
  • 控制台日志输出为“HTTP - &gt; Y,e,s”
  • 我已对此进行了评论,以排除此代码块中的任何互动

parseFactory.getArray()的调用主要按预期进行:

  • chars数组已正确更新
  • 控制台日志输出为“PARSE - &gt; N,o”

但绑定的HTML显示不会改变。

这是我的控制器:

app.controller('MainCtrl', ['httpFactory', 'parseFactory', function(httpFactory, parseFactory){
    var main = this;
    main.chars = ["I", "n", "i", "t"];

    // httpFactory.getArray().then(function(arrHttp){
    //     main.chars = arrHttp;
    //     console.log("HTTP --> " + main.chars);
    // });

parseFactory.getArray().then(function(arrParse){
    main.chars = arrParse;
    console.log("PARSE -> " + main.chars);
});

根据文档,Parse.Cloud.run() supports Promises。从控制台日志输出,似乎就是这种情况。

但绑定输出不会更新。

这是AngularJS,Parse还是我使用它的方式的问题?

(full code can be found here)

Demo Here

更新

我已将此问题与Parse记录为错误。将根据他们的反馈更新此帖子。

2 个答案:

答案 0 :(得分:1)

我不明白这种奇怪的行为,但是在$scope控制器中添加MainCtrl依赖项后绑定开始工作

<强>代码

app.controller('MainCtrl', ['httpFactory', 'parseFactory', '$scope',
  function(httpFactory, parseFactory, $scope) {

Demo Plunkr

答案 1 :(得分:1)

不要拨打Parse.Cloud.run(),而是使用他们的REST API for calling Cloud Functions

他们提供以下示例代码:

curl -X POST \
  -H "X-Parse-Application-Id: 4vwhWtM5Sf3ExRvXMkRI04jJj8r2ZETuBQYhiYGo" \
  -H "X-Parse-REST-API-Key: EX6MWjSEblsrHsJCqBZ1AevuTKz0ZlWLHPMloZqD" \
  -H "Content-Type: application/json" \
  -d '{}' \
  https://api.parse.com/1/functions/hello

基于此,我修改了parseFactory以使用$http代替Parse.Cloud.run()

app.factory('parseFactory', function($http) {
    return {
        getArray: function () {
            var request = {
                method: 'POST',
                url: 'https://api.parse.com/1/functions/hello',
                headers: {
                    'X-Parse-Application-Id': '4vwhWtM5Sf3ExRvXMkRI04jJj8r2ZETuBQYhiYGo',
                    'X-Parse-REST-API-Key': 'EX6MWjSEblsrHsJCqBZ1AevuTKz0ZlWLHPMloZqD',
                },
                data: {},
            };

            var parsePromise = $http(request).then(
                function(response){
                    console.log(response);
                    var array = ["F", "i", "x", "e", "d"];
                    return array;
                });
            return parsePromise;
        }
    };
});

这完全符合预期。