AngularJS ng-options Ajax默认选择选项

时间:2015-10-14 09:40:44

标签: javascript jquery ajax angularjs

如何根据ajax结果在ng-options中设置默认值?

<select ng-model="model.stuff" ng-options="o.name for o in options track by o.id"></select>

然后在我的控制器中我有

$http.get("myurl").then(
    // On Success
    function(response) {
        $scope.options = response.data;
    },
    // On Error
    function(error) {
        console.log("ERROR");
    }
);

示例数据就是这个

[
  {
    "id": 1,
    "name": "Foo"
  },
  {
    "id": 2,
    "name": "Bar"
  }
]

当我的控制器中的其他内容被激活,我的选择列表正确填充时,会触发此获取,并提供所有选项。

但有时我需要在加载ajax数据后设置默认值。例如,我需要从数据数组中加载id 1

这并不意味着加载response.data[1]这意味着我必须在response.data内搜索并查找具有id: 1的项目。这适用于此方法

function getArrayIndex(key, source){
    for (var i = 0; i < source.length; i++) {
        if (source[i].id == key) {
            return i;
        }
    }
}

这会告诉我response.data[0]id: 1因此我想在ajax加载数据时将其用作默认选定值。

我怎样才能做到这一点?

我已经阅读了其他一些问题,但我没有任何工作......我尝试使用ng-init值和整个id设置object但不起作用...

1 个答案:

答案 0 :(得分:0)

此处的解决方案是将以下内容添加到您的控制器中。

object ProcessMicroBatchStreams {
val calculateDistance = udf { 
 (lat: String, lon: String) =>      
 GeoHash.getDistance(lat.toDouble, lon.toDouble) }
 val DB_NAME = "IRT"
 val COLLECTION_NAME = "sensordata"
 val records = Array[String]()

def main(args: Array[String]): Unit = {
  if (args.length < 0) {
  System.err.println("Usage: ProcessMicroBatchStreams <master> <input_directory>")
  System.exit(1)
}
val conf = new SparkConf()
  .setMaster("local[*]")
  .setAppName(this.getClass.getCanonicalName)
  .set("spark.hadoop.validateOutputSpecs", "false")
/*.set("spark.executor.instances", "3")
.set("spark.executor.memory", "18g")
.set("spark.executor.cores", "9")
.set("spark.task.cpus", "1")
.set("spark.driver.memory", "10g")*/

val sc = new SparkContext(conf)
val ssc = new StreamingContext(sc, Seconds(60))
val sqc = new SQLContext(sc)
val gpsLookUpTable = MapInput.cacheMappingTables(sc, sqc).persist(StorageLevel.MEMORY_AND_DISK_SER_2)
val broadcastTable = sc.broadcast(gpsLookUpTable)


ssc.textFileStream("hdfs://localhost:9000/inputDirectory/")
  .foreachRDD { rdd =>
  //broadcastTable.value.show() // I can access broadcast value here
  if (!rdd.partitions.isEmpty) {
    val partitionedRDD = rdd.repartition(4)
    partitionedRDD.foreachPartition {
      partition =>
        println("Inside Partition")
        broadcastTable.value.show() // I cannot access broadcast value here
        partition.foreach {
          row =>
            val items = row.split("\n")
            items.foreach { item =>
              val mongoColl = MongoClient()(DB_NAME)(COLLECTION_NAME)
              val jsonObject = new JSONObject(item)
              val latitude = jsonObject.getDouble(Constants.LATITUDE)
              val longitude = jsonObject.getDouble(Constants.LONGITUDE)

              // The broadcast value is not being shown here
              // However, there is no error shown
              // I cannot insert the value into Mongo DB
              val selectedRow = broadcastTable.value
                .filter("geoCode LIKE '" + GeoHash.subString(latitude, longitude) + "%'")
                .withColumn("Distance", calculateDistance(col("Lat"), col("Lon")))
                .orderBy("Distance")
                .select(Constants.TRACK_KM, Constants.TRACK_NAME).take(1)
              if (selectedRow.length != 0) {
                jsonObject.put(Constants.TRACK_KM, selectedRow(0).get(0))
                jsonObject.put(Constants.TRACK_NAME, selectedRow(0).get(1))
              }
              else {
                jsonObject.put(Constants.TRACK_KM, "NULL")
                jsonObject.put(Constants.TRACK_NAME, "NULL")
              }
              val record = JSON.parse(jsonObject.toString()).asInstanceOf[DBObject]
              mongoColl.insert(record)
            }
        }
    }
  }
}
sys.addShutdownHook {
  ssc.stop(true, true)
}

ssc.start()
ssc.awaitTermination()
}
}

要匹配您的示例,请将$ scope.model设置为具有&#39; stuff&#39;的键的对象。当$ scope对象&#39;选项&#39;选项时,$ watch会触发。变化。 &#39;如果&#39;声明确保如果&#39;选项&#39;永远被设置为null。

有关$ watch

的更多信息,请参阅$scope documentation