1

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

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

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))
    })    
  );
}
4

1 回答 1

2

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

  • 您应该 watcher.dispatch()在通过回调更新列表后致电。
  • 顶级变量Parsejs.Proxy在回调中使用的。这个代理必须被保留(with js.retain(Parse))才能在当前事件循环之外使用,否则你会得到一个错误,比如js ref has been invalidated
于 2013-05-05T12:27:54.950 回答