Jsrender 我第一次尝试使用JsViews时需要帮助

Jsrender 我第一次尝试使用JsViews时需要帮助,jsrender,jsviews,Jsrender,Jsviews,我阅读了John PAPA关于JsRender的文章,并使用它加载外部HTML文件的方式 为了初始化模板,现在我尝试在上面使用JsViews,但它没有按预期工作 我试图在UL中构建一个简单的菜单,并将我的模板绑定到一个对象数组。 此对象的一个属性是是否选择菜单,这将更改文本的样式 数据绑定和渲染是有效的,我添加了一个按钮来证明这一点,但使用“助手”则不行 我想在这里发布我的代码,这样我就可以得到一些关于如何开始使用JsViews的建议,并理解为什么没有调用我的helper函数 Content o

我阅读了John PAPA关于JsRender的文章,并使用它加载外部HTML文件的方式 为了初始化模板,现在我尝试在上面使用JsViews,但它没有按预期工作

我试图在UL中构建一个简单的菜单,并将我的模板绑定到一个对象数组。 此对象的一个属性是是否选择菜单,这将更改文本的样式

数据绑定和渲染是有效的,我添加了一个按钮来证明这一点,但使用“助手”则不行

我想在这里发布我的代码,这样我就可以得到一些关于如何开始使用JsViews的建议,并理解为什么没有调用我的helper函数

Content of file: Default.htm

    <html lang="en">
        <head>
            <meta name="viewport" content="width=device-width, initial-scale=1.0" />

            <style>
                .menu{  color: Blue; }
                .hover{ color: Red; }
            </style>
            <script src="Scripts/jquery-1.7.1.js" type="text/javascript"></script>
            <script src="Scripts/js/jsrender.js" type="text/javascript"></script>
            <script src="Scripts/js/jquery.observable.js" type="text/javascript"></script>
            <script src="Scripts/js/jquery.views.js" type="text/javascript"></script>

            <script src="Scripts/my/my.model.js" type="text/javascript"></script>
            <script src="Scripts/my/my.template.js" type="text/javascript"></script>

            <script type="text/javascript">
                $(document).ready(function () {
                    my.template.loadMenuItemTemplate(onMenuItemAdded);
                });

                function onMenuItemAdded() {
                    $.link.menuItemTemplate
                    (
                        $("#lstMenu"),
                        my.model.menuItems
                    );
                }

                function Tests() {
                    my.model.menuItems.push(
                        {
                            id: 4,
                            label: "New",
                            selected: false
                        }
                    );
                    $.link.menuItemTemplate
                    (
                        $("#lstMenu"),
                        my.model.menuItems
                    );
                }
            </script>
        </head>
        <body>
            <ul id="lstMenu" class="menu"></ul>
            <button id="test" value="test" onclick="javascript:Tests();">Test !</button>
        </body>
    </html>

Content of file: _menuItem.tmpl.html


    <li data-link="class{:~setClassName()}"><span>{{>label}}</span></li>



Content of file: my.model.js


var my = my || {}; //my namespace

my.model = (function () {
    var _menuItems =
        [
            {
                id: 1,
                label: "Applications",
                selected: false
            },
            {
            id: 2,
            label: "Contacts",
            selected: true
            },
            {
            id: 3,
            label: "Environment",
            selected: false
            }
    ];
    return {
        menuItems: _menuItems
    };
})();


Content of file: my.template.js



var my = my || {};

my.template = (function () {
    var loadMenuItemTemplate = function (callback) {
        if (!($.templates.menuItemTemplate)) {
            var file = getTemplateFile("menuItem");

            $.when($.get(file))
            .done(function (tmplData) {
                $.templates(
                    { 
                        "menuItemTemplate": tmplData,
                        helpers: { setClassName: my.template.setClassName }
                    }
                );

                if (callback != null)
                    callback();
            });
        }
    },
    getTemplateFile = function (name) {
        return "../templates/_" + name + ".tmpl.html";
    },
    setClassName = function () {
        return (this.selected) ? "menu hover" : "menu";
    };
    return {
        getTemplateFile: getTemplateFile,
        setClassName: setClassName,
        loadMenuItemTemplate: loadMenuItemTemplate
    };
})();
文件内容:Default.htm
.菜单{颜色:蓝色;}
.hover{color:Red;}
$(文档).ready(函数(){
my.template.loadMenuItemTemplate(onMenuItemAdded);
});
函数onMenuItemAdded(){
$.link.menuitemplate
(
$(“#菜单”),
my.model.menuItems
);
}
功能测试(){
my.model.menuItems.push(
{
id:4,
标签:“新”,
所选:false
}
);
$.link.menuitemplate
(
$(“#菜单”),
my.model.menuItems
);
}
    测试! 文件内容:\ u menuItem.tmpl.html
  • {{{>label}
  • 文件内容:my.model.js var my=my |{}//我的命名空间 my.model=(函数(){ 变量菜单项= [ { id:1, 标签:“应用程序”, 所选:false }, { id:2, 标签:“联系人”, 所选:真 }, { id:3, 标签:“环境”, 所选:false } ]; 返回{ 菜单项:\ u菜单项 }; })(); 文件内容:my.template.js var my=my |{}; my.template=(函数(){ var loadMenuItemTemplate=函数(回调){ 如果(!($.templates.menuitemplate)){ var file=getTemplateFile(“menuItem”); $.when($.get(文件)) .完成(功能(tmplData){ $。模板( { “menuItemTemplate”:tmplData, 帮助程序:{setClassName:my.template.setClassName} } ); if(回调!=null) 回调(); }); } }, getTemplateFile=函数(名称){ 返回“./templates/“+name+”.tmpl.html”; }, setClassName=函数(){ 返回(已选择)-“菜单悬停”:“菜单”; }; 返回{ getTemplateFile:getTemplateFile, setClassName:setClassName, loadMenuItemTemplate:loadMenuItemTemplate }; })();
    谢谢你的帮助,
    克劳德(Claude)

    正如他所说的那样,这是一大堆代码,而且有点脱离了回购的组织。我可以告诉您,我通常为jsViews实现助手函数的方式如下所示:

    $.views.helpers({
        onAfterChange: function (ev)
        {                  
            if (ev.type == "change")
            {
                ProcessUpdatedView(this);
            }
        },      
        Testing: function (fromResponseListFlyout, length, index)
        {
            return fromResponseListFlyout + length + index;
        },
        matchCurrentLanguage: function (languageID)
        {
            return languageID == PageSettings.activeSurveyLanguage.LanguageID ? true : false;
        }
    }); 
    
    直接从视图对象调用它。我无法将您的所有代码都设置为测试,所以请尝试为其制作jfiddle,然后我就可以跟踪您的bug了。我整天都在使用jsViews,它占我公司用户界面的95%


    我很乐意为你解决这个问题,所以摆好小提琴,我们就可以解决了。:)愉快的编码。

    这是创建复制的大量代码。你能缩小范围并简化问题吗?如果问题仍然不起作用,请发布一个小的修改?您说您的助手函数没有被调用。试着创建一个小得多的样本来说明这个问题…谢谢你的回答。我又花了几个小时阅读教程和测试,现在效果很好。我可能会回来的时候,我会再次陷入困境虽然。。。再次感谢你。