如何在KnockoutJS中构建正确的视图模型(具有多个依赖项)?

Kev*_*Dog 1 javascript mvvm knockout.js

这是我正在使用的标记的子集:

<div id="item_one"></div>
<div id="item_two"></div>
<div id="item_three"></div>

<p id="result_one">0</p>
<p id="result_two">0</p>
<p id="result_three">0</p>
Run Code Online (Sandbox Code Playgroud)

期望的行为是:

  1. 单击div时,p标记的相应文本将从0切换为1.
  2. p标签的文本将被连接成一个字符串,例如,单击第二个项目,结果字符串将是"010".
  3. 有一个包含八个项目的数组,以二进制字符串作为关键字.点击后,阵列中的选定项目会发生变化.

这似乎是淘汰赛的好用,但我是一个完整的菜鸟.如何设置正确的依赖项?

RP *_*yer 5

以下是一种方法的示例:http://jsfiddle.net/rniemeyer/XqDsy/

为方便起见,我创建了一个暴露切换功能的"binaryObservable".

function binaryObservable(initialValue) {
   var result = ko.observable(initialValue);
   result.toggle = function() {
       result(result() === "1" ? "0" : "1");    
   };
   return result;
}

function ViewModel() {
   this.one = binaryObservable("0");
   this.two = binaryObservable("0");
   this.three = binaryObservable("0"); 

   this.combined = ko.dependentObservable(function() {
      return this.one() + this.two() + this.three();       
   }, this);

   this.choices = {
        "000": { id: 0, value: "000" },
        "001": { id: 1, value: "001" },
        "010": { id: 2, value: "010" },
        "011": { id: 3, value: "011" },
        "100": { id: 4, value: "100" },
        "101": { id: 5, value: "101" },
        "110": { id: 6, value: "110" },
        "111": { id: 7, value: "111" }
   };

   this.selectedChoice = ko.dependentObservable(function() {
       var combined = this.combined();
       return combined ? this.choices[combined] : {};
   }, this);   
}

ko.applyBindings(new ViewModel());
Run Code Online (Sandbox Code Playgroud)

那么HTML可能看起来像:

<div id="item_one" data-bind="click: one.toggle">option one</div>
<div id="item_two" data-bind="click: two.toggle">option two</div>
<div id="item_three" data-bind="click: three.toggle">option three</div>

<hr/>

<p id="result_one" data-bind="text: one">0</p>
<p id="result_two" data-bind="text: two">0</p>
<p id="result_three" data-bind="text: three">0</p>

<hr/>

<p data-bind="text: combined"></p>

<hr/>

Selected choice: <span data-bind="text: selectedChoice().id"></span>
Run Code Online (Sandbox Code Playgroud)