更新:请参阅下面的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 只需单击其中的“查看”按钮,就会显示一些警报消息。那个说&#34;应该说对象&#34;说这是一个字符串。不确定我上面提到的组合是走的路还是什么。只想获取每个数据绑定元素。
更新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);
答案 0 :(得分:2)
要访问兄弟绑定,您需要定义自定义绑定。定义这样一个简单包装click
绑定的绑定非常简单:
ko.bindingHandlers.clickFlag = {
init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
ko.applyBindingAccessorsToNode(element, {
click: function() {
return function(model, event) {
valueAccessor().call(this, model, event, allBindings.get('hasFlag'));
}
}
}, bindingContext);
}
}
答案 1 :(得分:1)
为什么不将它附加到点击处理程序?
<button type="button" data-who="Appellant" data-bind="click: function() {showLetter($data,Enum_AppealParties.Appellee);}">View</button>
但是,我同意以前的海报。这应该是模型的一部分。
答案 2 :(得分:0)
在这个类似的问题中,最终在没有好答案的情况下失败了:
Knockout how to get data-bind keys and value observables using element?
变得相当清楚,访问此信息的唯一方法是通过解析data-bind属性。这是您的小提琴的更新版本,展示了如何解析嵌套的绑定语句以获得所需内容:
http://jsfiddle.net/9mkw067h/83/
这是进行解析的代码:
self.showLetter = function (model, event) {
var binding_info = {}
var binding_attr = $(event.target).attr("data-bind")
var indent = false, indent_key = "";
$(binding_attr.split(",")).each(
function(idx, binding) {
var parts = binding.split(":")
var key = parts[0].trim()
var val = parts[1].trim()
if (val.indexOf("{") != -1) {
binding_info[key] = {}
indent = true
indent_key = key
}
if (indent == true) {
binding_info[indent_key][key] = val.replace("{", "").replace("}", "").trim()
}
else {
binding_info[key] = val
}
if (val.indexOf("}") != -1) {
indent = false
indent_key = ""
}
}
)
console.log(binding_info.hasFlag.flag)
}
最后,binding_info拥有您追求的目标。
更新:
上面的链接问题略有不同,因为它从另一个视图模型和给定的DOM元素开始,它说,我可以获得该DOM元素的绑定吗?它排除了自定义绑定。但是,在这种情况下,自定义绑定已经在使用中,因此Michael Best的帖子提供了一个更简洁的答案,没有自定义解析代码,并证明我的断言不正确,自定义解析是唯一的方法!