总结问题:
我的HTML很简单 - 我使用ng-repeat
从控制器中的数组输出字符:
<body ng-controller="MainCtrl as main">
<div ng-repeat="char in main.chars">
{{char}}
</div>
</body>
要填充此数组,我有2个工厂服务。
httpFactory
使用$http.get(...)
parseFactory
使用Parse.Cloud.run(...)
这两个都是成功的,并使用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
数组已正确更新对parseFactory.getArray()
的调用主要按预期进行:
chars
数组已正确更新但绑定的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还是我使用它的方式的问题?
我已将此问题与Parse记录为错误。将根据他们的反馈更新此帖子。
答案 0 :(得分:1)
我不明白这种奇怪的行为,但是在$scope
控制器中添加MainCtrl
依赖项后绑定开始工作
<强>代码强>
app.controller('MainCtrl', ['httpFactory', 'parseFactory', '$scope',
function(httpFactory, parseFactory, $scope) {
答案 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;
}
};
});
这完全符合预期。