Не передавайте функцию непосредственно привязке кликов, оберните ее анонимной функцией, чтобы вызвать ее в контексте вашего вид модель:
<button data-bind="click: function() { $parent.methodThatNeedsAccesToTheParentViewModel() }">Edit</button>
таким образом, когда связывание активировано, он будет использовать $ родителя в контексте вызова - т.е. это
стоит отметить, (так как мы не можем видеть структуру привязки файлов), что $ parent переменная будет ссылаться на привязку , предшествующую итерации текущего элемента, что не обязательно является родительским элементом элемента в графе объектов.
Edit: я пропускал некоторые выше скобку ...
Edit 2: это работает в связи с тем, как связывание будет решена. Когда привязка применяется нокаутом, выражение разрешается и должно оцениваться с помощью функции (и поэтому, когда вы привязываетесь непосредственно к функции, нет необходимости в скобках). Затем эта функция вызывается, когда активируется привязка кликов.
Но вот загвоздка, так как это ключевое слово в прототипных JavaScript не связан владельцем функции (т.е. там, где она определена), а на том, как она называется (как объяснено лучше в mozilla documentation) в этом случае нокаут вызывает функцию не через объект, который ее владеет (что правильно привязывает к этому оператору), но привязывает его явно к его текущему контексту привязки (так как он не может знать, какой экземпляр функция была первоначально взята). Вы можете повторить это поведение, получая ссылку на вашу функцию, а затем связывая его с другим объектом во время вызова - пример:
A = function() {
this.name = "foo";
};
A.prototype.getName = function() { return this.name; };
a = new A();
console.log(a.getName()); // should log "foo" as expected
f = a.getName; // now f contains a reference to the function
console.log(f()); // this call the function in the current scope - most likely the window, and return nothing
b = new Object(); // another generic object - suppose this is knockout binding context
console.log(f.call(b)); // this bind the call explicitly to b, but since b has no name property, nothing is returned again
console.log(f.call(a)); // this time we bind the function call to an object that has a name proerty, so the correct value is returned
С другой стороны, путем создания анонимной функции вы вызываете ваш метод явно в области требуемого объекта ($ parent), поэтому этот связан правильно.
Надеюсь, это немного поможет ...:)
Вы спрашиваете, как на самом деле получить * это * переменная в методе, чтобы указать на * ViewModel * например? Или что-то другое? – Grim
@Grim the first :) – FutuToad