Как вызвать вложенную функцию из внешнего нокаута JS -- knockout.js пол Связанный проблема

How to call a nested function from out side knockout js


-3
vote

проблема

русский

Я изучаю нокаут JS. Так что еще мое понимание не очень ясно. так извинен, чтобы задать этот вид вопроса.

Сначала см. Код, чтобы увидеть, что я пытаюсь достичь. Вот jsfiddle link http://jsfiddle.net/tridip/vvdvgnfh/

 <код> <button data-bind="click: $root.printproduct()">Print Product</button> <table id="table1" cellspacing="0" cellpadding="0" border="0">     <tr>         <th style="width:150px">Product</th>         <th>Price ($)</th>         <th>Quantity</th>         <th>Amount ($)</th>     </tr>      <tbody data-bind='template: {name: "orderTemplate", foreach: lines}'></tbody> </table>  <script type="text/html" id="orderTemplate">     <tr>         <td><select data-bind='options: products,                                optionsText: "name",                                optionsCaption:"--Select--",                                value: product'>                                </select>         </td>          <td>             <span data-bind='text:price' ></span>         </td>         <td>             <input data-bind='value:quantity' />         </td>          <td ><span data-bind='text:subtotal()'></span></td>      </tr> </script>      var CartLine = function () {           var self = this;           self.products = ko.observableArray(_products);           self.product = ko.observable(1);           self.price = ko.observable(1);           self.quantity = ko.observable(1);             self.product.subscribe(function(item){               if(!item)               {                  self.price(0);                  self.quantity(0);                  return;               }              self.price(item.price);              self.quantity(item.quantity);           });            self.subtotal = ko.computed(function () {                return self.price() * self.quantity();           },self);          self.printproduct = function() {              alert('hello');         }                   };        var Cart = function () {           // Stores an array of lines, and from these, can work out the grandTotal           var self = this;           self.lines = ko.observableArray([new CartLine()]); // Put one line in by default         };        ko.applyBindings(new Cart());   

Print Product - это боковая кнопка, но если мне нужно позвонить в функцию, которая определена в CartLine тогда, как я могу получить доступ? Это вообще возможно?

Спасибо

Английский оригинал

i am learning knockout js. so still my understanding is not very clear. so apologized to ask this kind of question.

see the code first to see what i am trying to achieve. here is jsfiddle link http://jsfiddle.net/tridip/vvdvgnfh/

<button data-bind="click: $root.printproduct()">Print Product</button> <table id="table1" cellspacing="0" cellpadding="0" border="0">     <tr>         <th style="width:150px">Product</th>         <th>Price ($)</th>         <th>Quantity</th>         <th>Amount ($)</th>     </tr>      <tbody data-bind='template: {name: "orderTemplate", foreach: lines}'></tbody> </table>  <script type="text/html" id="orderTemplate">     <tr>         <td><select data-bind='options: products,                                optionsText: "name",                                optionsCaption:"--Select--",                                value: product'>                                </select>         </td>          <td>             <span data-bind='text:price' ></span>         </td>         <td>             <input data-bind='value:quantity' />         </td>          <td ><span data-bind='text:subtotal()'></span></td>      </tr> </script>      var CartLine = function () {           var self = this;           self.products = ko.observableArray(_products);           self.product = ko.observable(1);           self.price = ko.observable(1);           self.quantity = ko.observable(1);             self.product.subscribe(function(item){               if(!item)               {                  self.price(0);                  self.quantity(0);                  return;               }              self.price(item.price);              self.quantity(item.quantity);           });            self.subtotal = ko.computed(function () {                return self.price() * self.quantity();           },self);          self.printproduct = function() {              alert('hello');         }                   };        var Cart = function () {           // Stores an array of lines, and from these, can work out the grandTotal           var self = this;           self.lines = ko.observableArray([new CartLine()]); // Put one line in by default         };        ko.applyBindings(new Cart()); 

Print Product is a out side button but if i need to call a function which is defined in CartLine then how could i access ? is it at all possible ?

thanks

</div
  

Список ответов

1
 
vote
vote
Лучший ответ
 

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

 <код>  <tr data-bind="click: $root.selectRow">     <td><select data-bind='options: products,   

И функция корзины теперь имеет селевочные функции и функции печати:

 <код>   var Cart = function () {       // Stores an array of lines, and from these, can work out the grandTotal       var self = this;       self.lines = ko.observableArray([new CartLine()]); // Put one line in by default       self.selectRow = function(line) {           self.selected = line;       }        self.print = function() {           if(self.selected) {               self.selected.printproduct();           }       }   };   

Тогда кнопка печати просто вызывает функцию печати на корне, которые делегаты на выбранную картер

 <код> <button data-bind="click: $root.print">Print Product</button>   

Вот обновление jsfiddle http://jsfiddle.net/omerio/vvdvgnfh/1/

 

You can't call a function on CartLine outside the loop as it's outside the context (scope), one approach you can follow is to have a click binding on the row, when the user clicks the row, it calls a function on the root scope to save a reference to the selected cartline:

 <tr data-bind="click: $root.selectRow">     <td><select data-bind='options: products, 

and the Cart function now has a selectRow and a print functions:

  var Cart = function () {       // Stores an array of lines, and from these, can work out the grandTotal       var self = this;       self.lines = ko.observableArray([new CartLine()]); // Put one line in by default       self.selectRow = function(line) {           self.selected = line;       }        self.print = function() {           if(self.selected) {               self.selected.printproduct();           }       }   }; 

then the print button simply calls the print function on the root which delegates to the selected cartline

<button data-bind="click: $root.print">Print Product</button> 

Here is an update jsFiddle http://jsfiddle.net/omerio/vvdvgnfh/1/

</div
 
 

Связанный проблема

2  Валидация только с весом не работает  ( Validation with onlyif doesnt work ) 
Я бегу в проблему при попытке сделать: <код> newNoteText: ko.observable().extend({ required: { onlyIf: function () { return this.ShowNote == true } } }) ...

0  ko.tojson & Javascripterializer Проблема  ( Ko tojson javascriptserializer issue ) 
Я использую веб-форму ASP.NET и скрытое значение, чтобы сохранить мой нокаут ViewModel, чтобы перейти к следующей странице после сериализации. <Код> ko.toJS...

15  Разрешите круговые ссылки от объекта JSON  ( Resolve circular references from json object ) 
Если у меня есть сериализованные json от json.net, как: <код> User:{id:1,{Foo{id:1,prop:1}}, FooList{$ref: "1",Foo{id:2,prop:13}} Я хочу иметь нокаут вы...

4  Как получить ценность до того, как это меняется? В нокауте.js  ( How to get value before it changes in knockout js ) 
Я использую отображение MUTIONS, чтобы загрузить некоторые MEGA JSON DATA. Я знаю, как обнаружить изменения в обратном вызове «Обновить». Но как мне сравнит...

3  Установка начального значения Rockout ViewModel с помощью бритвы  ( Setting initial value of knockout viewmodel using razor ) 
Я нахожу это странно, что не могу найти какую-либо информацию о том, как динамически просмотреть нокаутмодел. Я думаю, мои условия поиска неверны или что-то. ...

-2  Привязка данных с помощью кнопки  ( Data binding using a button ) 
Я хотел связать список ID на столе, но не выполняю это: html: <код> <table> <thead><tr><th>ID</th></tr></thead> <tbody data-bind="foreach: recor...

0  Как правильно форматировать валюту с нокаутами?  ( How to correctly format currency with knockoutjs ) 
Мне нужно в формате номер как локализованная валюта с нокаутами. Но у меня есть проблемы с этим. Я создал jsfiddle для этого. Если кто-то может быть таким при...

1  Добавить новые теги в пользовательских привязки  ( Add new tags in custom binding ) 
Я использую нокаут с bootstrap-tokenfield и Typeabead , чтобы показать теги. Ранее мне нужен способ показать мои метки хорошим способом, и поэтому я создал...

10  Необтуарная проверка клиента в нокауте шаблона  ( Unobtrusive client validation in knockout template binding ) 
У меня есть модель с аннотациями данных, и я динамически связываю, что с ViewModel с использованием нокаута шаблона привязки и плагина сопоставления. Я пытаюс...

17  Вид на карте Модели для проверки нокаута  ( Map view models to knockoutjs validation ) 
Я создавал страницу с помощью ASP.NET MVC 2, используя knockoutjs, knockoutjs сопоставление плагина ,, jquery 1.7.1. Я хотел бы также использовать плагин Vali...

3  Привязка новых элементов DOM для ViewModel после вызова AJAX  ( Binding new dom elements to viewmodel after ajax call ) 
У меня проблемы, связывающие новые элементы DOM к моим просмотраммоделью. Эти элементы находятся на частичном представлении, загруженном с использованием вызо...

2  Вызов шаблона из нокаута  ( Calling template from a knockoutjs binding ) 
в привязке кнукаута, я хотел бы создать немного HTML и его к элементу. Этот HTML идентичен шаблону, у меня уже есть. Я пытался сделать очевидное, и призывая ш...

1  Изменение Имя события событий не работает в ASP.NET  ( Changing eventsouce event name not working in asp net ) 
У меня есть <код> asp.net mvc приложение с <код> knockout.js Я использую <код> HTML5 EventSource для push-сообщений C # <код> private static void Up...

5  Bootstrap всплывающую подсказку, вызывая прыжок на iPad  ( Bootstrap tooltip causing screen to jump on ipad ) 
Так что я использую NOCKOUT-Bootstrap.js lib, чтобы помочь с инициализацией подсказки Bootstrap при использовании knockout.js, чтобы применить подсказки к нек...

0  Невозможно распознать элемент с классом, который находится внутри Foreach?  ( Unable to recognize element with class which is inside foreach ) 
Я пытаюсь здесь функциональность автозаполнения, и я застрял, когда я ввожу что-то в TextBox, я ожидаю, что он попадает $('.autoclass').autocomplete({ //my...