可观察列表不从js Callback更新

时间:2013-05-04 09:14:02

标签: dart parse-platform

我正在尝试从js.Callback内更新我的模板。当我从cities.add("test")main()时,它工作正常,并使用字符串更新我的模板,但在回调中执行相同的操作,模板不会更新。我正在尝试使用Parse.com中的Javascript API。登录也可以从查询中获取对象。我刚刚开始学习Dart,所以也许这是非常明显的我缺少的东西?

更新:通过调用js.retain(Parse)然后调度()解决问题 下面的工作解决方案。

myDart.html

<template iterate="city in cities"> {{city}} </template>

myDart.dart

import 'dart:html';
import 'package:web_ui/web_ui.dart';
import 'package:js/js.dart' as js;

var Parse = js.context.Parse;

List<String> cities = new List();

void main() {

  js.retain(Parse); //Solution to problem (1/2)

  Parse.initialize("id", "key");

  if(Parse.User.current() == null) {

    Parse.User.logIn("user", "password",
        js.map({
          "success": new js.Callback.once((user) => parseData()),
          "error": new js.Callback.once((user,error) => print(error.message))
        })
    );
  }
  else
    parseData();

  cities.add("hej");
}

void parseData() {

  //Get Cities
  var City = Parse.Object.extend("City");
  var query = new js.Proxy(Parse.Query, City);
  query.equalTo(js.map({"ACL" : Parse.User.current()}));

  query.find(
    js.map({
      "success": new js.Callback.once((array){  
        for (var i=0; i < array.length; i++){
          String cityName = array[i].get("name");
          cities.add(cityName);
          dispatch(); //Solution to problem (2/2)
        }
      }),
      "error": new js.Callback.once((object,error) => print(error.message))
    })    
  );
}

1 个答案:

答案 0 :(得分:2)

您的代码似乎有两个问题:

  • 您应该在通过回调更新列表后致电watcher.dispatch()
  • 顶级变量Parse是回调中使用的js.Proxy。必须保留此代理(使用js.retain(Parse))以在当前事件循环之外使用,否则您将收到错误,例如 js ref已失效