读取'init'和'update'中的绑定值

时间:2015-02-28 16:02:07

标签: knockout.js

在绑定中使用preprocessing时,我可以很容易地获取绑定的值'与Knockout尝试解析它之前绑定值相关的语法'

ko.bindingHandlers.uniqueName.preprocess = function(val) {
    return val || 'true';
}

如何在' init'中获取此值?或者'更新'我的自定义绑定部分?



ko.bindingHandlers.myBinding = {
  preprocess: function(val) {
    //Here I can read the text value of my binding, i.e., 'myObservale' as text
    console.log(val);
    return val;
  },
  init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
    //How can I read the text value of my binding here? i.e., 'myObservale' as text?
    ko.applyBindingsToNode(element, {
      text: valueAccessor()
    });
  },
  update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {}
};

var vm = {
  myObservable: ko.observable('This is the observable value')
};

ko.applyBindings(vm);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<div data-bind="myBinding: myObservable"></div>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:2)

我不确定你要在这里完成什么,但如果你想在你的绑定中使用字符串"myObservable",你应该在绑定中传入一个字符串。

<div data-bind="myBinding: 'myObservable'"></div>

如果要将传递给绑定的表达式转换为字符串,则必须将引号添加到表达式中。只需确保您的绑定使用简单的变量名称,而不是复杂的表达式。

<div data-bind="myBinding: myObservable"></div>
ko.bindingHandlers.myBinding = {
    preprocess: function (value) {
        return '"' + value + '"'; // changes the expression to "myObservable"
    },
    init: function (element, valueAccessor) {
        var value = valueAccessor(); // string: 'myObservable'
        // ...
    }
};

由于您只需要在另一个绑定中使用表达式的名称,因此最好的方法是使用preprocess()函数根据表达式添加其他绑定,而不是像我们一样转换该表达式这里。

为此,您需要使用preprocess()函数的第三个参数来公开可用于添加其他绑定的函数。有了它,您可以使用文本表达式来派生属性绑定。

preprocess: function (value, name, addBinding) {
    addBinding('attr', '{ "id": "myprefix_' + value + '" }');
    return value; // use the original expression in your binding
},

您的init()update()函数只能使用该值而不用担心名称。

init: function (element, valueAccessor) {
    var value = valueAccessor(); // the value of myObservable
    // ...
}