如何获得knockouts兄弟数据绑定属性

时间:2014-10-14 18:45:38

标签: javascript json knockout.js

更新:请参阅下面的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.toJSko.toJSON$.parseJSONJSON.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);

3 个答案:

答案 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);
    }
}

http://jsfiddle.net/mbest/9mkw067h/85/

答案 1 :(得分:1)

为什么不将它附加到点击处理程序?

<button type="button" data-who="Appellant" data-bind="click: function() {showLetter($data,Enum_AppealParties.Appellee);}">View</button>

http://jsfiddle.net/9mkw067h/86/

但是,我同意以前的海报。这应该是模型的一部分。

答案 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的帖子提供了一个更简洁的答案,没有自定义解析代码,并证明我的断言不正确,自定义解析是唯一的方法!