2013-07-08 3 views
0

я есть главный GLTkComponent ============= xgltk.dart GLTkComponent. дротик ==================================Dart связывают JSONObject ошибка: типа «Список <dynamic>» не является подтипом типа «JSONObject» от «значения»

@observable 
class GLTkComponent extends WebComponent { 

    ObservableList<JsonObject> ListTk = toObservable(new ObservableList<JsonObject>()); 

    JsonObject currentRow; 

    cm.ViewType currentView; 

    inserted() { 
    populateAccountsTable(); 
    currentView = cm.ViewType.LIST; 
    } 

    populateAccountsTable() { 
    ServiceStack.get("http://localhost:9998/dmtk").done((results) { 

     JSON.parse(results).forEach((data) { 
     JsonObject currentRow = new JsonObject.fromMap(data); 
     ListTk.add(currentRow); 
     }); 

    }).fail((e)=>print("Error in xgltk.populateAccountsTable() ${e}")).go(); 

    } 
} 

======== ===== xgltk.html ======================================================================================== =

... 
<body> 
    <element name="x-gltk" constructor="GLTkComponent" extends="div"> 
     <template> 
     <div class="container-fluid"> <!--list --> 
      <div class="row-fluid"> 
      <template instantiate="if currentView == cm.ViewType.LIST"> 
       <x-gltk-list bind-list="ListTk" bind-current="currentRow" bind-view="currentView"></x-gltk-list> 
      </template> 
      </div> 
     </div> <!-- end div list --> 

     </template> 
     <script type="application/dart" src="xgltk.dart"></script> 
    </element> 
    </body> 
... 

============ xgltk-list.dart GlTkListComponent ======================== ==

@observable 
class GlTkListComponent extends WebComponent { 

    ObservableList<JsonObject> list; 

    JsonObject current; 

    cm.ViewType view; 

    inserted() { 

    } 

    String handleMenuClickClass(){ 
    if(current != null) { 
     return ""; 
    } 
    else { 
     return "disabled"; 
    } 
    } 

    handleRowClick(JsonObject row) { 
    current = list.firstWhere((e) => e.Tk == row.Tk); 

    assert(list is ObservableList<JsonObject>); 
    assert(current is JsonObject); 
    } 

    String handleRowClickClass(JsonObject row){ 
    if(current != null) { 
     return row.Tk == current.Tk ? "info" :""; 
    } 
    else { 
     return ""; 
    } 
    } 

    AddNew() { 
    } 
} 

======================= xgltk-list.html =============================================== ==========

--- 
<body> 
    <element name="x-gltk-list" constructor="GlTkListComponent" extends="div"> 
     <template> 
     <div id="id_list"> <!--div list --> 
      <div class="span8" id="content"> 
      <table class="table table-hover" id="id_list_table"> 
       <thead> 
       <tr> 
        <th>Tài khoản</th> 
        <th>Tên tài khoản</th> 
        <th>Ngoại tệ</th> 
        <th>Định khoản</th> 
        <th>Công nợ</th> 
        <th>Sổ cái</th> 
        <th>Tk Mẹ</th> 
       </tr> 
       </thead> 
       <tbody template iterate="row in list"> 
       <tr on-click="handleRowClick(row)" class="{{handleRowClickClass(row)}}"> 
        <td>{{row["Tk"]}}</td> 
        <td>{{row["Ten_Tk"]}}</td> 
        <td>{{row["Ma_Nt"]}}</td> 
        <td><template instantiate="if row['Loai_Tk']"><i class="icon-check"></i></template></td> 
        <td><template instantiate="if row['Tk_Cn']"><i class="icon-check"></i></template></td> 
        <td><template instantiate="if row['Tk_Sc']"><i class="icon-check"></i></template></td> 
        <td><template instantiate="if row['Tk'] != row['Tk_Me']">{{row["Tk_Me"]}}</template></td> 
       </tr> 
       </tbody> 
      </table> 
      </div> 
     </div> <!-- div list --> 
     </template> 
     <script type="application/dart" src="xgltk-list.dart"></script> 
     <!-- for this next line to work, your pubspec.yaml file must have a dependency on 'browser' --> 
     <script src="packages/browser/dart.js"></script> 
    </element> 
    </body> 
--- 

Когда я нажал на лист имеет ошибку:

web_ui.observe: unhandled error calling Closure: (dynamic, dynamic) => dynamic from <observer 56>. 
error: 
type 'List<dynamic>' is not a subtype of type 'JsonObject' of 'value'. 

stack trace: 
#0  GLTkComponent.currentRow= (http://127.0.0.1:3030/Z:/future13/3SNext/web/out/xgltk.dart:126:29) 
#1  GLTkComponent.created_autogenerated.<anonymous closure>.<anonymous closure> (http://127.0.0.1:3030/Z:/future13/3SNext/web/out/xgltk.dart:62:56) 
#2  DomPropertyBinding._safeSetter (package:web_ui/templating.dart:360:11) 
#3  DomPropertyBinding.insert.<anonymous closure> (package:web_ui/templating.dart:369:58) 
#4  _ExpressionObserver._runCallback (package:web_ui/observe/observable.dart:556:16) 
#5  _ExpressionObserver._deliver (package:web_ui/observe/observable.dart:640:17) 
#6  deliverChangesSync.deliverChangesSync.<anonymous closure> (package:web_ui/observe/observable.dart:435:58) 
#7  SplayTreeMap.forEach (dart:collection/splay_tree.dart:209:8) 
#8  deliverChangesSync.deliverChangesSync (package:web_ui/observe/observable.dart:435:33) 
#9  setImmediate.<anonymous closure> (package:web_ui/src/utils_observe.dart:29:13) 
#10  _ReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:81:92) 

Как это исправить. Пожалуйста, помогите мне. Спасибо вам большое.

Туан Хоанг Ань

+0

Привет - JSONObject автора здесь. Можете ли вы поделиться примером текста JSON, который вы передаете в 'JSON.parse (results) .forEach ((data) {' –

+0

вот он: [{"Tk": "111", "Ten_Tk": " Tiền mặt "...}, .......... {" Tk ":" 911 "," Ten_Tk ":" Xác định kết quả kinh doanh "...}] –

+0

xgltk-list.html может отображаться, но ошибка при связывании значения glTkListComponent.current обратно в GLTkComponent.currentRow. Возможно, @observable не может поддерживать JsonObject. –

ответ

0

Я не могу достаточно воспроизвести то, что вы показываете с данным, но я думаю, что сообщение об ошибке

type 'List' is not a subtype of type 'JsonObject' of 'value'.

говорит вам, что в какой-то момент currentRow является содержащий List вместо JsonObject при вызове ListTk.add(currentRow)

JSON.parse(results).forEach((data) { 
    JsonObject currentRow = new JsonObject.fromMap(data); 
    ListTk.add(currentRow); 
}); 

Это migh т быть, если ваш JSON выглядит следующим образом:

[ 
    {"Tk":"111","Ten_Tk":"Tiền mặt"...},     <-- Becomes a JsonObject 
    {"Tk":"911","Ten_Tk":"Xác định kết quả kinh doanh"}, <-- Becomes a JsonObject 
    [{...},{...}]          <-- Becomes a List 
] 

Вы можете попробовать добавить пару print линий, чтобы помочь диагностировать:

print(data); // output the actual data that JsonObject is going to convert from 
    print(data is Map); // expecting true 
    var currentRow = new JsonObject.fromMap(data); 
    print(currentRow.runtimeType.toString()); // expecting JsonObject 
    ListTk.add(currentRow); 
+0

Я держу одну строку в таблице, и вот новые данные: {Tk: 111, Ten_Tk: Tiền mặt, Ma_Nt: VND, Loai_Tk: false, Bac_Tk: 1, Tk_Sc: true, Tk_Cn: false, Tk_Me: 111, Rec_Version: 14218, Rec_Id: 14173, Rec_Create: 2013-07-13T09: 20: 54.0280000, Rec_Created_Id : 1, Статус: 1, Rec_Modified: 2013-07-13T09: 20: 54.0280000, Rec_Modified_Id: 1}. Произошла ошибка –

+0

Спасибо за помощь. Вот мой вывод (данные): {Tk: 111, Ten_Tk: Tiền mặt, Ma_Nt: VND, Loai_Tk: false, Bac_Tk: 1, Tk_Sc: true, Tk_Cn: false, Tk_Me: 111, Rec_Version: 14218, Rec_Id: 14173 , Rec_Create: 2013-07-13T09: 20: 54.0280000, Rec_Created_Id: 1, Статус: 1, Rec_Modified: 2013-07-13T09: 20: 54.0280000, Rec_Modified_Id: 1}. print (data is Map): true. печать (currentRow.runtimeType.toString()): JsonObject. Но произошла ошибка –

+0

Ошибка произошла при передаче currentRow между GLTkComponent и GLTkListComponent. Возможно, @observable не может поддерживать JsonObject. –