工厂的数据来得太晚了 - Angular.js

时间:2016-02-15 04:57:01

标签: javascript angularjs ajax http

之前我有类似的代码工作,出于某种原因,这一块不是。这是一个简单的想法;调用该函数,它调用基于app.factory('getSensors', ['data', function (data) { return { get : function() { data.get('sensors').then(function (results) { var sensors = []; for(var i = 0; i < results.sensors.length; i++) { sensors.push({ 'id' : Number(results.sensors[i][0]), 'name' : results.sensors[i][1], 'type' : results.sensors[i][2], 'device' : results.sensors[i][3], 'unit' : results.sensors[i][4], 'parent' : Number(results.sensors[i][5]), 'latitude' : Number(results.sensors[i][6]), 'longitude' : Number(results.sensors[i][7]) }); } return sensors; }); } }; }]); 的工厂来获取数据并返回该数据的数组。首先是工厂:

data

使用以下app.factory('data', ['$http', function ($http) { var serviceBase = '/api/'; var obj = {}; obj.get = function (q) { return $http.get(serviceBase + q).then(function (results) { return results.data; }); }; return obj; }]); 服务:

getSensors

对于工厂的电话,我已尝试过getSensors.getgetSensors.get()for,即使我知道其中一些是错误的。我也尝试过不在函数中包装这段代码,使用返回上面定义的函数,并在没有对象的情况下返回数组(它是如何在我的其他函数中工作的,即使我不认为这是最佳实践,它只是更简单)。我甚至将forEach循环替换为getSensors

基本上,$http工厂的返回值总是在我使用控制台调试完成{{1}}调用之前发生,即使代码在回调函数中并且在该循环之后。在花了2个小时查看并重写此代码之后,我不知道如何实现这一点。我可能只是遗漏了一些明显的东西,或者正在违反Angular的某些方面。

1 个答案:

答案 0 :(得分:1)

您缺少的关键部分是<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/CCLL" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#303e73" android:orientation="vertical"> <LinearLayout xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight=".5"> <ListView android:isScrollContainer="false" android:stackFromBottom="true" android:background="#26315c" android:id="@+id/messagesLV" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center_horizontal" android:transcriptMode="alwaysScroll"/> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight=".6" android:background="#303e73" android:orientation="horizontal"> <ImageButton android:layout_gravity="center" android:id="@+id/addimgbtn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:scaleType="centerInside" android:padding="15dp" android:background="#303e73" android:src="@mipmap/whiteadd" /> <EditText android:id="@+id/messageET" android:layout_weight=".5" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:lines="5" android:gravity="left" android:textColor="#FFFFFF" android:textColorHint="#FFFFFF" android:inputType="textCapSentences|textMultiLine" android:hint="Enter your Message..."> </EditText> <ImageButton android:layout_gravity="center" android:id="@+id/sendbtn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:scaleType="centerInside" android:padding="15dp" android:background="#303e73" android:src="@mipmap/whitesend" /> </LinearLayout> return方法中.then()创建的承诺:

getSensors.get()

然后使用它,只需将app.factory('getSensors', ['data', function (data) { return { get : function() { return data.get('sensors').then(function (results) { var sensors = []; /* for loop (same as before) goes here */ return sensors; }); } }; }]); 服务作为依赖项注入,然后调用

getSensors