简体   繁体   English

创建可观测值,将其他可观测值作为单个地图返回

[英]Create observable returning other observables as a single map

I have an own binding for numeric inputs made in knockoutJS which accepts only numbers. 我有一个单独的绑定,用于用knockoutJS进行的numeric输入,该绑定仅接受数字。

To make big numbers I declare various instances of number in a NumberField like: 为了生成大数字,我在NumberField声明了各种数字实例,例如:

var NumberField = function () {
  var self = this;
  self.maskFormat = "0";
  self.firstNumber = ko.observable("");
  self.secondNumber = ko.observable("");
  self.thirdNumber = ko.observable("");
};

And

<input id="0" maxlength="1" type="tel" data-bind="numeric: firstNumber">
<input id="1" maxlength="1" type="tel" data-bind="numeric: secondNumber">
<input id="2" maxlength="1" type="tel" data-bind="numeric: thirdNumber">

This is working like a charm, but when I made submission, system is expecting a map with numbers. 这就像是一种魅力,但是当我提交时,系统期望一张带有数字的地图。 I achieved it IMHO in an ugly way: 我以丑陋的方式实现了恕我直言:

Added to NumberField this attribute: NumberField添加此属性:

this.cleanNumber = ko.pureComputed(function () {
    return this.firstNumber().toString() + this.secondNumber().toString() + this.thirdNumber().toString();
}, this);

And in the code, when I need to use it I must do this: 在代码中,当我需要使用它时,我必须这样做:

let unwrapNumbers = this.numbers().cleanNumber().split("").map(function (item){
    return Number(item);
});

This is working, but... I'm pretty sure there is an easier and more straight way.... Any suggestions? 这是可行的,但是...我敢肯定,有一种更简单,更直接的方法....有什么建议吗?

I think it could help to split the computed in to two parts: 我认为这可能有助于将计算分为两部分:

  1. Getting the numbers you want to include in order 获取要按顺序包含的数字
  2. Creating a string based on the ordered values 根据顺序值创建一个字符串

Often it makes sense to split a computed in to several pure computeds that have a single clear data processing responsibility. 通常,将一个计算拆分为几个具有单个明确数据处理职责的纯计算是有意义的。

 var NumberField = function () { var self = this; self.firstNumber = ko.observable(1); self.secondNumber = ko.observable(2); self.thirdNumber = ko.observable(3); self.orderedNumbers = ko.pureComputed(function() { return [self.firstNumber, self.secondNumber, self.thirdNumber].map(ko.unwrap); }); self.cleanedNumber = ko.pureComputed(function() { return self.orderedNumbers().join(""); }); }; var nf = new NumberField(); // If you want the numbers: console.log(nf.orderedNumbers()); // If you want the string console.log(nf.cleanedNumber()); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 

Now, I'm not sure what your requirements are, but you can take it one step further and use an observableArray as the base data format: 现在,我不确定您的要求是什么,但是您可以将其进一步observableArray ,并使用observableArray作为基本数据格式:

 var NumberField = function () { var self = this; self.numbers = ko.observableArray( [ko.observable(0), ko.observable(1), ko.observable(2)]); self.add = function() { self.numbers.push(ko.observable(self.numbers().length)); } self.unwrappedNumbers = ko.pureComputed(function() { return self.numbers().map(ko.unwrap); }); self.cleanedNumber = ko.pureComputed(function() { return self.unwrappedNumbers().join(""); }); }; ko.applyBindings(new NumberField()); 
 label { display: block } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> <div data-bind="foreach: numbers"> <label> <span data-bind="text: 'Number ' + $index()"></span> <input type="number" data-bind="textInput: $parent.numbers()[$index()]"> </label> </div> <button data-bind="click: add">add</button> <pre> Unwrapped:<code data-bind="text: unwrappedNumbers"></code> Cleaned:<code data-bind="text: cleanedNumber"></code> </pre> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 RXJS 将单个可观察对象转换为可观察对象数组 - RXJS convert single observable to array of observables RXJS:动态创建的可观察对象中的单个可观察对象 - RXJS: Single Observable from dynamically created Observables 如何组合两个 observable 来创建新的 observable? - How to combine two observables to create new observable? 从可观察对象列表创建可观察对象 - Create an Observable object from a list of Observables RxJs - 创建 Observable 的 Observable 数组的正确模式/方法是什么? - RxJs - What is the proper pattern/way to create an Observable array of Observables? Observable.create(...)。map不是函数 - Observable.create(…).map is not a function KnockoutJS Observables的Observable对象 - KnockoutJS Observable object of observables 如何使用将其映射到值为可观察值的对象的函数映射Observable? - How do I map an Observable using a function that maps it to an object where the values are observables? 如何通过Knockout.js的“observables”创建(“map”)复杂类型? - How to create (“map”) complex types through “observables” with Knockout.js? RxJS 仅当第一个(源)observable 发出一个值而不是其他组合的 observable 时才发出一个值 - RxJS Emit a value only if the first (source) observable emits a value and not other combined observables
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM