Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 主干路由点击不';第二次尝试时没有响应_Backbone.js_Validation - Fatal编程技术网

Backbone.js 主干路由点击不';第二次尝试时没有响应

Backbone.js 主干路由点击不';第二次尝试时没有响应,backbone.js,validation,Backbone.js,Validation,当用户希望预览由路由调用的发票时,我正在函数中执行表单验证: routes: { "new" : "newInvoice", "new/:assignmentid" : "newInvoiceAssignment", "edit/:invoiceid" : "editInvoice", "preview/:invoiceid" : "previewInvoice",

当用户希望预览由路由调用的发票时,我正在函数中执行表单验证:

routes: {
        "new"                   : "newInvoice",
        "new/:assignmentid"     : "newInvoiceAssignment",
        "edit/:invoiceid"       : "editInvoice",
        "preview/:invoiceid"    : "previewInvoice",
        "preview"               : "preview",
        "delete/:invoiceid"     : "deleteInvoiceModal",
        "whyCant"               : "whyCant",
        "whatsThis"             : "whatsThis"
    },
这是我在表单上的两个按钮(实际上是一个按钮和一个href):

<div class="span8 alignRight">
    <button id="saveInvoiceDraft" type="submit" class="btn btn-warning">Save Draft</button>
    <a id="previewInvoice" class="btn btn-primary">Preview &amp; Send</a>
</div>
最后,当我单击“Preview&Send”按钮时,下面的PreviewWinVoice(invoiceid)函数将运行,正确捕获丢失的一个表单字段并显示错误消息。在这一点上,即使我填充表单字段,该按钮也会失效,不再响应。但是,“保存草稿”按钮工作正常,其代码与PreviewWinVoice()函数中的代码相同

我知道可能有更好的方法可以做到这一点,但我在继承的应用程序的另一部分中采用了这种方法。事实上,当我键入此内容时,我想知道由于sendDraft()函数起作用,它是一个按钮,而previewInvoice()函数不起作用,因此它是一个href可能与此有关

function previewInvoice(invoiceid) {
    var invoice = new Invoice({"invoiceid": invoiceid});
    invoice.set({"invoiceid": invoiceid,"invoicestatus": "draft"});
    formGetter(invoice);
    validateInvoiceForm(invoice);

    if (window.errors.length == 0) {
        //business logic here

        if (window.panel == undefined) {
            // business logic here
        }
        else {
            //save business logic here
        }
    }
    else {
        showInvoiceErrors();
    }
}
你知道为什么按钮不再响应了吗?我没有在控制台中看到任何错误。我在函数中添加了一个consol.log来显示不同表单元素的值,它第一次在控制台中显示,但是如果我更改数据并再次单击按钮,该日志不会更新,对我来说,这是另一个提示,它只是没有启动。

侦听
hashchange
事件以触发对路由的导航。首次单击
previewInvoice
按钮时,URL哈希片段设置为
#preview
,并触发匹配路由

当你第二次点击同一个按钮时,散列实际上并没有改变,因此路由器并没有捕捉到它

我很难推荐一个解决这个问题的好办法。通常我会建议捕获click事件并调用
router.navigate(“preview”,{trigger:true})手动。但是,根据您的代码示例,您的应用程序似乎是围绕
路由器
构建的,并且没有一个
视图
层来处理DOM事件,正如您在大多数主干应用程序中所期望的那样

在路由器层面上,解决这个问题有点棘手。您可以使用
router.navigate
在执行
预览
路由后设置虚拟哈希。这将导致链接第二次触发
hashchange
。不幸的是,这意味着
预览
页面将不可添加书签,并且由于您没有使用pushState,因此会留下一个无关的历史记录条目


我担心这个问题必须通过黑客修复(如上所述)或重大重构来解决。

我也有同样的问题,我的解决方案是加入一个处理程序,该处理程序执行一个隐藏在历史中的假“中间”路线,以便Backbone.history将导航注册为更改并触发操作

在需要路由操作触发的链接上放置一个类,无论URL是否相同:

<a href="/someaction" class="js-ensureNav">do it</a>
实际处理程序:

_ensureNav: function (event) {
    var route_name = $(event.target).attr('href').slice(1);
    Backbone.history.navigate("fake");
    Backbone.history.navigate(route_name, {trigger: true, replace: true});
},

而不是

var url=“#预览”

$('#previewInvoice').attr('href',url)

试试这个

变量日期=新日期()

变量url='#预览?日期:'+日期

$('#previewInvoice').attr('href',url)


因此,每次生成新请求时,这将解决您的问题。

谢谢。这有助于我更好地理解它。奇怪的是,这个页面上另一个保存草稿的按钮按照我希望的方式工作,而且没有哈希更改。我会试试你的建议,让你知道进展如何。我们也在使用视图。
events: {
    "click .js-ensureNav": "_ensureNav",
},
_ensureNav: function (event) {
    var route_name = $(event.target).attr('href').slice(1);
    Backbone.history.navigate("fake");
    Backbone.history.navigate(route_name, {trigger: true, replace: true});
},