我已经选择了一个项目,我正在尝试将一些数据从服务返回到我的控制器.我已经在这里待了大约12个小时,并尝试了不同的方法.它们通常都会产生同样的"缺失数据".
我试过了
$http.get右侧放在控制器内而不使用promises我觉得我现在所拥有的是一个简单的,因为我可以得到它,而我所读到的一切都说这应该有效
这些链接就是从今天开始的.
我认为可能存在$ scope问题,因为过去我已经看到$ scopes在使用多个控制器时没有获取数据,但是该站点只是在index.html中声明一个控制器作为<body ng-app="myApp" ng-controller="BodyCtrl">设置.主app.js使用状态(我认为来自ui-router)就像这样......
.state('app.view', {
url: '/view',
templateUrl: 'views/view.tpl.html',
controller: 'MyCtrl'
})
Run Code Online (Sandbox Code Playgroud)
将控制器连接到不同的页面.此外,该网站还有一些其他控制器从服务中获取数据,我首先将其作为模板查看,然而,数据和返回比我想要的更复杂.但最重要的是,控制器正在访问服务提供的数据.他们都使用$ resource,这就是我从这个问题开始的方式.我坚持使用$ http因为它应该可以工作,而且我希望在我进入"更高级别"的东西之前使用它.另外,我只需要从端点获取GET,所以觉得$ resource太过分了.
服务
.factory('MyService', ['$http', '$q', '$rootScope', function ($http, $q, $rootScope) {
var defer = $q.defer();
var factory = {};
factory.all = function () {
$http({method: 'GET', url: 'http://URLtoJSONEndpoint'}). …Run Code Online (Sandbox Code Playgroud) angularjs angularjs-service angularjs-scope angularjs-controller angularjs-http
Angular 的 $q 文档说“$q 承诺被 angular 中的模板引擎识别,这意味着在模板中,您可以将附加到范围的承诺视为结果值。”
Angular 的视图模板还允许您评估表达式,这意味着您可以调用从作用域公开的函数。
我发现视图模板能够引用真实值、承诺(最终解析为真实值)或返回真实值的函数,但不能引用返回承诺的函数,它们总是呈现{}到视图模板中。
谁能做得更好或引导我朝着正确的方向前进?
(也许在视图模板中使用函数是个坏主意;这种技术还有其他问题,因为 Angular 观察函数无法在不调用函数的情况下判断它是否发生了变化,所以被观察的函数在每个摘要周期都会被评估。我已经看到这两个 问题,并且在这两个问题中,推荐的答案是使用 promise.then 来更改作用域上的正常属性,并让视图模板监视正常属性而不是 promise。我明白了,但是对于我的使用,我想提供一些参数来计算一个值,并且直接在视图模板中提供这些参数很方便。基本上我试图在Flask或Rails 中编写类似 url_for 的东西。)
我遇到了一些问题$q.defer();
当我使用回调时,我的代码正在运行(视图已更新),但$q.defer();事实并非如此.
这是我的代码:
服务:
eventsApp.factory('eventData', function($http, $q) {
return {
getEvent: function(callback) {
var deferred = $q.defer();
$http({method: 'GET', url: '/node/nodejsserver/server.js'}).
success(function(data, status, headers, config){
//callback(data.event);
deferred.resolve(data.event);
console.log('status: ', status, ' data: ', data);
}).
error(function(data, status, headers, config){
deferred.reject(status);
console.log('status: ', status);
});
return deferred.promise;
}
};
});
Run Code Online (Sandbox Code Playgroud)
控制器:
eventsApp.controller('EventController',
function EventController($scope, eventData) {
$scope.event = eventData.getEvent();
}
);
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
然后我找到了这个答案,我更新了我的控制器,如下所示:
eventsApp.controller('EventController',
function EventController($scope, eventData) {
eventData.getEvent().then(function(result) { …Run Code Online (Sandbox Code Playgroud) 问题在于将复选框(已选中/未选中)的状态绑定到对象值.
HTML:
<div ng:controller="Ctrl">
<div ng:repeat="(letter, number) in obj">
{{letter}} and {{number}}
<input type="checkbox" ng:model="obj[letter]">
</div>
Run Code Online (Sandbox Code Playgroud)
控制器:
function Ctrl() {
this.obj = {a:true,b:true};
};?
Run Code Online (Sandbox Code Playgroud)
单击第一个复选框时,它会影响第二个复选框的状态,但模型是正确的,因此obj变为{a:false,b:true}.
示例可以在http://jsfiddle.net/alexpetrov/tRxzr/找到
如何解决这个问题?