2014-12-15 3 views
0

Я хочу форматировать числа в режиме, разделенном запятой. Я нашел это jsfiddle, который удовлетворяет моим требованиям. Мне нужно добавить еще одно значение pureComputed для моего vm, и я пробовал его таким образом, изменяя modified jsfiddle.Форматирование валюты с pureComputed

Однако я получаю сообщение об ошибке в консоли, говоря:

Unable to process binding "text: function(){return Test }" Message: undefined is not a function.

Что мне здесь не хватает? my js is

(function ($) { 
var cleanInput = function (value) { 
    return parseFloat(value.replace(/[^0-9.-]/, '')); 
} 

var formatInput = function (value) { 
    toks = value.toFixed(2).replace('-', '').split('.'); 
    var display = $.map(toks[0].split('').reverse(), function (elm, i) { 
     return [(i % 3 == 0 && i > 0 ? ',' : ''), elm]; 
    }).reverse().join('') + '.' + toks[1]; 

    return value < 0 ? '(' + display + ')' : display; 
} 

ko.bindingHandlers.money = { 
    init: function (elm, valueAccessor) { 
     $(elm).change(function() { 
      valueAccessor()(cleanInput(elm.value)); 
     }).addClass('money'); 
    }, 
    update: function (elm, valueAccessor, allBindingsAccessor) { 
     var value =ko.utils.unwrapObservable(valueAccessor()) 
     $elm = $(elm), 
     method = $elm.is(":input") ? "val" : "html"; 

     $elm[method](formatInput(value)).toggleClass('negative', value < 0); 
    } 
};})(jQuery); 


$(function(){ 
var viewModel={ 
    Cash:ko.observable(1234.56), 
    Test : ko.pureComputed(function() { 
     return (self.Cash() * 10).toFixed(0); 
    }) 
} 
ko.applyBindings(viewModel); 

});

+0

Пожалуйста, включите минимальную версию этого образца кода в вопросе. Таким образом, если ссылка гниет, этот вопрос останется полезным для будущих посетителей. – Jeroen

ответ

1

У вас нет фото, версия self определена в любом месте вашего кода.

Вам нужно, чтобы превратить ваш ViewModel в функции конструктора, где вы можете определить теперь self, чтобы указать на this

var ViewModel = function() { 
    var self = this; 
    self.Cash = ko.observable(1234.56); 
    self.Test = ko.pureComputed(function() { 
     return (self.Cash() * 10).toFixed(0); 
    }); 
} 
ko.applyBindings(new ViewModel()); 

Demo JSFiddle.

В вы хотите сохранить объект буквальным как ваш ViewModel вам нужно добавить вычисленная после того как вы создали ViewModel:

var viewModel = { 
    Cash: ko.observable(1234.56) 
} 
viewModel.Test = ko.pureComputed(function() { 
    return (ViewModel.Cash() * 10).toFixed(0); 
}); 
ko.applyBindings(viewModel); 

Demo JSFiddle.

Смотрите также: Difference between knockout View Models declared as object literals vs functions

+0

он работает, но когда я хочу отобразить '' 'Test''' в формате' '' money''', изменив '' ' '' '' '' '' 'Я получаю ту же ошибку. PLS найти обновленный JSfiddle. http://jsfiddle.net/r51ybL13/2/ – Rifky

+0

Вычисленная строка возвращает строку, поэтому значение 'value.toFixed (2) .replace ('-', '') .split ('.')' выходит из строя в формате ввода , Либо верните номер из вычисленного 'return (self.Cash() * 10),' http://jsfiddle.net/mhbq49km/. Или обрабатывайте случай 'value', являющийся строкой в ​​функции' formatInput' – nemesv

+0

, теперь она работает .. :-) – Rifky

Смежные вопросы