Подтвердить что ты не робот

Когда $parent.foo является прототипом метода, это не родительский, обходной путь?

В моей модели модели у меня есть прототипы, где этот контекст является элементом в каждой для каждой, а не для реальной модели представления. Как достичь этого?

  <button data-bind="click: $parent.methodThatNeedsAccesToTheParentViewModel">Edit</button>

ViewModel:

ViewModel.prototype.methodThatNeedsAccesToTheParentViewModel= function () {
        this = duff //this is the item in the foreach, not the real parent
    };

Идеи?

4b9b3361

Ответ 1

Не передавать функцию непосредственно привязке кликов, обернуть ее анонимной функцией, чтобы она вызывалась в контексте вашей модели представления:

<button data-bind="click: function() { $parent.methodThatNeedsAccesToTheParentViewModel() }">Edit</button>

таким образом, когда привязка активирована, он будет использовать $parent как контекст вызова - то есть этот

Стоит отметить (поскольку мы не можем видеть структуру привязок файлов), что родительская переменная $будет ссылаться на привязку, предшествующую повторному текущему элементу, что необязательно родительский элемент элемента в графе объектов.

Изменить: мне не хватало скобок выше...

Изменить 2: это работает из-за того, как разрешена привязка. Когда привязка применяется нокаутом, выражение разрешается и должно оцениваться функцией (и поэтому, когда вы привязываетесь непосредственно к функции, нет необходимости в скобках). Затем эта функция вызывается, когда активируется привязка кликов.

Но вот catch, так как ключевое слово this в прототипальном javascript не связано владельцем функции (т.е. где оно определено), а скорее так, как оно называется (как объяснено лучше в документации mozilla), в этом случае нокаут вызывает функцию не через объект, который ей владеет (что правильно привязывает оператор this), но привязывая его явно к его текущему контексту привязки (поскольку он не может знать, какой экземпляр функция была первоначально взята). Вы можете реплицировать это поведение, получив ссылку на свою функцию, а затем привязывая ее к другому объекту во время вызова - пример:

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), поэтому этот привязан правильно.

Надеюсь, это немного поможет...:)

Ответ 2

У меня была та же проблема, и я решил ее следующим образом:

<button data-bind="click: $parent.methodThatNeedsAccesToTheParentViewModel.bind($parent)">Edit</button>

Ответ 3

У вас есть $parent в вашей привязке к данным, поэтому он должен вызывать метод родителя. Вы хотели иметь $data.methodThatNeedsAccesToTheParentViewModel как привязку данных? Если вы это сделали, вам нужно изучить какую-то структуру pubsub, либо postock post или jquery pubsub plugin