5

呼び出す必要のある関数を含むJSON文字列があります。

私のJSONは次のようになります:

{  
    "type":"listview",
    // the function I would like to call
    "content":"dynoData.getRetailers()",
    "custom_classes":["","nMT pickList","",""],
    "lib":"static_listview.html",
    "tmp":"tmp_listview_inset",
    "lang":"locale_search",
    ...

これを使用して、クライアントでjQueryMobileリストビューをアセンブルしています。動的データを取得するには、を呼び出す必要がありますdynoData.getRetailers()

しかし、私は電話をかけるのに苦労しています:-)

これは私が試していることです:

var dyn = $.parseJSON( passed_JSON_string ),
    content = dyn.content;

それを呼び出すと関数がトリガーされることを望んでいましたが、関数名を文字列として返すだけです。

質問
実際の機能をトリガーするにはどうすればよいですか?

ありがとう!

編集
実際のページのHTML要素にJSON文字列を配置します。これを、作成している要素に置き換えます。HTMLは次のとおりです。

<ul data-template="true" data-config='{  
    "type":"listview",
    "content":"dynoData.getRetailers()",
    "custom_classes":["","nMT pickList","",""],
    "lib":"static_listview.html",
    "tmp":"tmp_listview_inset",
    "lang":"locale_search",
    "theme":"c",
    "filter":"true"
    }'></ul>

これらすべてを属性に入れることはできdata-ますが、それは面倒です...

解決策:これはうまくいきました:

1)JSONを次のように変更します。

..."method":"getRetailers", ...

2)Javascriptからの呼び出し:

content = dynoData[ dyn.method ]();

みんな、ありがとう!

4

4 に答える 4

5

関数が常にdynオブジェクトの一部であると仮定すると、次のような表記を使用して関数を呼び出すことができます。

dyn['dynoData']['getRetailers']();

したがって、jsonを調整できる場合は、次のようなものを送り返すことができます。

"content":{ "mainObject": "dynoData" , "method" :"getRetailers"}

そして、変数を使用してそれを動的関数に変換します。

  dyn[content.mainObject][content.method]();

jQueryを使用する例として、次を使用してみてください。

$('div')['hide']();

これはと同じです:

$('div').hide()
于 2012-12-09T22:18:11.587 に答える
1

ConversationJSをお試しください。動的な呼び出しが非常に簡単になり、コードベースを分離するための優れた方法です:https ://github.com/rhyneandrew/Conversation.JS

于 2012-12-09T23:14:18.547 に答える
1

charlietflが指摘したように、オブジェクト表記を使用して関数を呼び出すことができます。あなたの場合、あなたはそれを取り除き()そしてそれを分割し、そしてそれをこのように呼ぶ必要があります。

jQuery(function($) {
    var temp = $('ul').data('config').content.replace(/\(\)/g, '').split('.');
    window[temp[0]][temp[1]]();
});

ただし、これで問題が解決する可能性があります。将来について考える場合は、少し拡張する必要があります。このように、深さがわからなくても、とにかく呼び出すことができます。

jQuery(function($) {
    var temp = $('ul').data('config').content.replace(/\(\)/g, '').split('.'), func, i, il = temp.length;
    for(i = 0; i < il; i++) {
        if(func == null) {
            func = window[temp[i]];
            continue;
        }
        func = func[temp[i]];
    }
    func();
});
于 2012-12-09T22:28:34.170 に答える
0

JSONは純粋に渡されるデータ表記であるため、簡単に読み取って解析できるため、関数の概念はありません。ただし、これに対処する方法は他にもあります。それがジレンマに対処する唯一の方法であると考え始めた場合は、一歩下がって設計を検討してください。これを使用する代わりに:

eval(yourCode);

これを試して

var tempFun = new Function(yourCode);
tempFun(); 
于 2012-12-09T22:23:03.100 に答える