【发布时间】:2014-10-14 18:45:37
【问题描述】:
更新:请参阅下面的 jsfiddle 链接
再次更新 - 请参阅更新 2
我有以下 HTML:
<button type="button" data-who="Appellant" data-bind="click: showLetter, hasFlag: { value: DeterminationLettersGenerated, flag: Enum_AppealParties.Appellee, enableIfTrue: true }">View</button>
在 showLetter 函数中,我想做这样的事情:
self.showLetter = function (model, event) {
var flagValue = $(event.target).data("bind").flag;
...
}
我所说的兄弟姐妹是指绑定的实际点击事件的兄弟姐妹。我只需要得到任何能得到我的东西Enum_AppealParties.Appellee。
我尝试了ko.toJS、ko.toJSON、$.parseJSON 和JSON.stringify 的多种组合。他们总是给我返回以下字符串,并在其周围加上引号或转义引号:
click: showLetter, hasFlag: { value: DeterminationLettersGenerated, flag: Enum_AppealParties.Appellee, enableIfTrue: true }
我需要的是上面的字符串转换为 JSON,所以在最坏的情况下我需要在代码中执行以下操作:
self.showLetter = function (model, event) {
var magicObject = SomeAwesomeAnserHere();
var flagValue = magicValue.hasFlag.flag;
...
}
更新: 重新请求查看它的回购,请查看此链接Fiddle 只需单击其中的“查看”按钮,就会出现一些警报消息。说“应该说对象”的那个说它是一个字符串。不确定我上面提到的组合是要走的路还是什么。只想获取每个数据绑定元素。
更新 2: 我知道KO必须做我想要完成的事情,对吧?因此,在 KO 代码中进行了一些挖掘之后,我看到了它将数据绑定字符串转换为可用对象(在本例中为函数)的位置。我接近让它在我自己的绑定/函数中有用。这还不是 100% 有效。但也许有比我聪明的人在修补它......
此代码在 KO.click 事件中,如上面的 self.showLetter:
var rewrittenBindings = ko.expressionRewriting.preProcessBindings($(event.target).data("bind"), null);
var functionBody = "with($context){with($data||{}){return{" + rewrittenBindings + "}}}";
var almost = new Function("$context", "$element", functionBody);
【问题讨论】:
-
您可以尝试创建一个repro 吗?我很确定我们可以提供帮助,但是如果没有整个设置,这有点困难。理想情况下,让问题编辑器中的 Stack Snippets 按钮旋转一下。
-
感觉就像您以错误的方式进行此操作,而不是按照设计的工作方式使用淘汰赛。为什么你想要的属性不是 ViewModel 本身的一部分?除非在少数情况下(通常与自定义绑定有关),否则尝试将其从绑定中拉回并没有多大意义。
-
@MattBurland Enum_AppealParties 是一个全局 json 对象。成为模型的一部分不需要也没有意义。主要是因为它在许多地方和不同的模型中使用。
-
@Grandizer Matt 是对的:您本身不应该有一个全局 JSON 对象。您应该将
enum创建为必需模块,然后将其引入需要它的每个视图模型中。或者更好的是,要求它进入您的客户端数据模型。这就是我们所做的。 -
@EricTaylor,这听起来很有趣。你能说明你的意思吗?不知道如何在 javascript 中“要求”东西。作为一个模块,对我来说只是另一个导入的文件。对我来说,无论如何,这似乎又是一个全局变量。很想看看你的意思。对于我的 JS 代码来说,这可能是改变生活的一天。 ;)
标签: javascript json knockout.js