2

我正在使用作为模板 HotTowel 构建一个 mvc 应用程序(你知道,durandal,淘汰赛,微风等)。该应用程序尚未准备好,但我们正在取得良好进展:)。在一个功能的中间,我需要构建一个对 javascript 函数的动态调用。使用硬编码值的调用类似于:

<a href="#" id="openreport"                                                 
onclick="showReport('@Url.Action("Index","Report", new { Id= 9, languageId = 2})');">Show  
report</a>

上面的调用工作正常。当我尝试使用 knockoutjs 将 onclick 事件绑定到字符串属性时,我的麻烦就开始了。像这样的东西:

<a href="#" id="openReport" data-bind="onclick: $root.reportUrl()"  > 
 Show report                                                

在哪里报告 url 它是一个可观察的变量。这里是打字稿代码:

export var reportUrl =<any> ko.observable();

export var expandRow = function (myObjectComeFromATable) {

    var urlAction = '@Url.Action("Index", "Report", new { Id= ID_TO_REPLACE, languageId = LANG_TO_REPLACE }) ';
    var url = "showReport('"+urlAction+"');";
    reportUrl(url);   
};

更新 使用引号很好。淘汰变量的值与之前显示的硬代码值相同。也许这是我的 sintaxis 在布局中的问题?

4

1 回答 1

0

您正在尝试评估 observable 中的代码?我不认为它会起作用。您可以在函数中手动执行 eval。但我认为这不是一个好的解决方案。

如果您总是在点击时调用“showReport”,则不需要 eval:只需在模型中有一个包含要调用的 url 的属性,然后在回调函数中运行 showReport(yourUrl)。

如果您在单击时调用的函数发生变化,您可以保留对要在模型中调用的函数的引用。类似的东西(但更清洁):

var model = function() {
    var _this = this;
    this.function1 = function() {
         alert('hello');   
    }
    this.function2 = function() {
         alert('world');   
    }
    this.run = function() {
         _this.current(); 
    }
    this.change = function() {
         _this.current = _this.function2;   
    }

    this.current = this.function1;
}
ko.applyBindings(new model());


<a href="#" data-bind="click: run">Click</a>
<a href="#" data-bind="click: change">Switch</a>

见这里:http: //jsfiddle.net/pp2QA/2/

于 2013-07-10T06:08:17.693 回答