迭代可敲除的Javascript属性,以创建可订阅的

时间:2018-12-12 00:58:32

标签: javascript knockout.js

有没有办法迭代javascript对象上的属性并测试可观察对象,以便我可以在其上创建预订?下面只是一个简单的示例,但我的对象具有大约30个属性。

var name = {
   firstName: ko.observable(),
   lastName: ko.observable()
};

// Iterate properties and test for observable to create subscription on.

lastName.subscribe(function(s) {
   // modified
);

firstName.subscribe(function(s) {
   // modified
);

2 个答案:

答案 0 :(得分:2)

您可以在name对象上Object.values,并为ko.isObservable的任何对象订阅:

Object.values(name).forEach(v => {
  if(ko.isObservable(v))
    v.subscribe(() => { console.log("Do the cha cha") })
}) 

您可以看到它working here

如果要保留列表,则只需过滤ko.isObservable

let subs = Object.values(name).filter(ko.isObservable) 

然后稍后订阅或取消订阅。

subs.forEach(v => v.subscribe(() => { console.log("Did the cha cha") }))

答案 1 :(得分:1)

类似这样的事情。这样,您就可以在代码中稍后取消订阅的对象列表。

var nameTest = {
  salutation: "Hi",
  firstName: ko.observable("Test"),
  lastName: ko.observable("Person")
};

var subscribedObjects = Object.values(nameTest)
  .filter(item => ko.isObservable(item))
  .map(observableItem => observableItem.subscribe(newValue => console.log(newValue)));

ko.applyBindings(nameTest);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<div data-bind="with: nameTest">
  <input type="text" data-bind="textInput: salutation" />
  <input type="text" data-bind="textInput: firstName" />
  <input type="text" data-bind="textInput: lastName" />

</div>


<div data-bind="with: nameTest">
  <span data-bind="text: salutation"></span>
  <span data-bind="text: firstName"></span>
  <span data-bind="text: lastName"></span>
</div>