JSfiddle:http://jsfiddle.net/hugolpz2/QCjJD/9/

给定一个带有硬编码按钮,纯JS注入按钮和Mustache注入按钮的html锚,最终结果如下:

<div id="anchor">
    <button class="tpl html status0" data-lexeme="A">A</button>
    <button class="tpl html status0" data-lexeme="B">B</button>
    <button class="tpl PureJS status0" data-lexeme="A"></button><!-- injected with pure JS -->
    <button class="tpl PureJS status0" data-lexeme="B">B</button><!-- injected with pure JS -->
    <button class="tpl Mustache status0" data-lexeme="A">A</button><!-- injected with Mustache -->
    <button class="tpl Mustache status0" data-lexeme="B">B</button><!-- injected with  Mustache -->
</div>


给定参考数据,例如

var json = [
    { "id": "A",   "status": 0  },
    { "id": "B",   "status": 0  },
    { "id": "C",   "status": 1  },
    { "id": "AB",  "status": 1  },
    { "id": "ABC", "status": 1  },
    // { ... } +100 entries
];


给定JS / JQuery函数classUpdateFromData(),它从数据中bpdate按钮的类。

// classUpdateFromData():
function classUpdateFromData($set) {
    $($set).each(function (i) {  // <------------------------------ seems this is the trouble! Select html, js,but NOT mustache generated content!
        var lexeme = $(this).data('lexeme');
        var val = getJsonVal(json, lexeme);
        if (val.status === 1) {
            $(this).toggleClass('status1 status0');
        } else { /* nothing yet! */ }
    });
}

classUpdateFromData('#anchor > .tpl');


为什么我的函数仅更新硬编码的按钮和纯JS注入的按钮,而不更新MustacheJS注入的按钮?

如何修复使其适用于所有工具,包括Mustache创建的功能?

注意:classUpdateFromData()在模板函数后被触发。

最佳答案

您的injectTPL()函数是异步的:它实际上在获取JSON数据和呈现模板之前返回。

查看对$.getJSON()的调用:它接受一个回调函数,并在数据准备就绪时调用它。该函数依次呈现模板并将结果标记附加到文档中。

由于classUpdateFromData()是在injectTPL()之后立即调用的,因此它将在调用该回调函数之前运行。

您可以从传递给classUpdateFromData()的回调中调用$.getJSON(),或者更一般地说,重构injectTPL(),以便它本身接受回调并从传递给$.getJSON()的回调中调用它:

function injectTPL(url, list, tplId, anchor, callback) {
    console.log("Mustache TPL = Fired !");
    $.getJSON(url, function(data) {
        for (var i = 0; i < list.length; i++) {
            var lexeme = list[i]; // "火山口";
            var template = '{{#CFDICT}}{{#'+ lexeme +'}}' + $(tplId).html()
                         + '{{/'+ lexeme +'}}{{/CFDICT}}';
            var info = Mustache.to_html(template, data);
            $(anchor).append(info);
        }
        callback();  // Invoke our own callback.
    });
    console.log("Mustache TPL = End !");
}


然后,您可以从传递给classUpdateFromData()的回调中调用injectTPL(),它将在适当的时间被调用:

injectTPL(
    'http://d.codio.com/hugolpz/getJson--/App/data/cfdict.json',
    l, '#CFDICT-tpl', '#anchor', function() {
        classUpdateFromData('#anchor > .tpl');
    }
);


您将找到更新的小提琴here

关于javascript - JS无法在mustacheJS的产品上使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17514507/

10-13 00:30