2

オブジェクト プロパティ (my_json) に、外部ファイルから読み込まれた JSON リストを保存したいと思います。このコードでは、my_json プロパティは常に null と等しくなります:{

よろしくお願いします:)

@CustomTag('scaffold-toolsbar-element')
class MyCustomTag extends PolymerElement{

  void click_menu_item(String label) {
    shadowRoot.querySelector('#page_name').text = label;
  }

  MyCustomTag.created() : super.created(){

    var menu_list = new MenuList('menu_items.json');

    addElementToMenu(list_value){
      var newElement = new Element.tag('core-item');
      newElement.setAttribute("icon", list_value["icon"]);
      newElement.setAttribute("label", list_value["label"]);
      newElement.onClick.listen((e) => click_menu_item(list_value["label"]));
      shadowRoot.querySelector('#core_menu_item').children.add(newElement);
    };

    menu_list.my_json.forEach(addElementToMenu);
  }
}

class MenuList {
  String path;
  List my_json;

  MenuList(String path) {
    this.path = path;
    var httpRequest = new HttpRequest();
    httpRequest
    ..open('GET', path)
    ..onLoadEnd.listen((e) => requestComplete(httpRequest))
    ..send('');
  }

  requestComplete(HttpRequest request) {
    // request.status is 200 
    // request.responseText is 
    // "[ {"icon": "settings", "label": "Signin", "main_page": "signin-element"}, {"icon": "home", "label": "About", "main_page": "about-page-element"} ]" 
    if (request.status == 200) {
      this.my_json = JSON.decode(request.responseText);
    }else{
      this.my_json = null;
    }
  }
}
4

3 に答える 3

2

必要なコードは次のとおりです。

HttpRequest.request(path, responseType: 'json').then((HttpRequest request) {
  var json = request.response;
});

現在、Dartium にはバグがあることに注意してください。

https://code.google.com/p/dart/issues/detail?id=20129

回避策として、responseType パラメータを省略して request.responseText を使用できます。

よろしく、ロバート

于 2014-07-22T15:07:50.943 に答える
1

解決策はロバートから来ました。JSON リストの結果が割り当てられる前にオブジェクト プロパティを読み取ろうとしました。だから私は常に null プロパティを持っています...それを避けるために、次のようにオプションのパラメーター async を HttpRequest.open に追加します: ..open('GET', path, async:false )

これが最終的なコードです。

@CustomTag('scaffold-toolsbar-element')
class MyCustomTag extends PolymerElement{

  void click_menu_item(String label) {
    shadowRoot.querySelector('#page_name').text = label;
  }

  MyCustomTag.created() : super.created(){

    var menu_list = new MenuList('menu_items.json');

    addElementToMenu(list_value){
      var newElement = new Element.tag('core-item');
      newElement.setAttribute("icon", list_value["icon"]);
      newElement.setAttribute("label", list_value["label"]);
      newElement.onClick.listen((e) => click_menu_item(list_value["label"]));
      shadowRoot.querySelector('#core_menu_item').children.add(newElement);
    };

    menu_list.my_json.forEach(addElementToMenu);
  }
}

class MenuList {
  String path;
  List my_json;

  MenuList(String path) {
    this.path = path;
    var httpRequest = new HttpRequest();
    httpRequest
    ..open('GET', path, async:false)
    ..onLoadEnd.listen((e) => requestComplete(httpRequest))
    ..send('');
  }

  requestComplete(HttpRequest request) {
    if (request.status == 200) {
      this.my_json = JSON.decode(request.responseText);
    }else{
      this.my_json = null;
    }
  }
} 
于 2014-07-22T16:38:08.617 に答える