2015-08-20 27 views
0

那么ko.observable()究竟干什么?这是情况。你可以看到,我有一个布尔ko.observable()。我点击设置为该值,所以它应该切换包含在它的方法调用中的真假的值。在这种情况下,ko.observable究竟在做什么?

当我看到数组被填充到开发人员工具中时,我看到所选内容不是= true或false,而是=相当广泛的函数,并且我无法在该内部的任何位置找到true或false值,所以我不知道什么时候使用ko.observable()

我所期望的是tab.selected是tabArray [tab] .selected的值,并且当页面加载时,正确。但是,在写出文本值时,单击tabArray [tab] .selected = [Object object]后。我尝试使用:

<pre data-bind="text: JSON.stringify(ko.toJS(tab.selected)"></pre> 

(这里找到:http://www.knockmeout.net/2013/06/knockout-debugging-strategies-plugin.html),并打印出真或假,我需要在其他地方做这个,我需要的是价值?因为我不确定ko.observable在做什么。

define(['knockout', 'text!../Content/SSB/PartialViews/MainContent.html'], function (ko, MCTemplate) { 
    ko.components.register('MainContent', { 
     template: MCTemplate 
    }); 

    var MainViewModel = { 
     tabArray: [ 
       { name: 'bob', selected: ko.observable(true) }, 
       { name: 'bib', selected: ko.observable(false) }, 
       { name: 'bab', selected: ko.observable(false) }, 
       { name: 'bub', selected: ko.observable(false) }, 
       { name: 'beb', selected: ko.observable(false) }, 
     ] 
    }; 
    ko.applyBindings(MainViewModel); 
    return { 
     viewModel: MainViewModel 
    } 
}); 

的HTML

<div id="tab"> 

    <ul class="nav nav-tabs" role="tablist"> 
     <!--ko foreach: {data: $parent.tabArray, as: 'tab'}--> 

      <li data-bind="click: tab.selected, css: { 'active': tab.selected}">   
        <a data-bind="attr: {href: '#' + tab.name}, text: name"></a> 
       <div data-bind="text: tab.name"></div> 
       <div data-bind="text: tab.selected"></div> 
      </li> 
     <!--/ko--> 
    </ul> 
    <!--ko foreach: {data: $parent.tabArray, as: 'tab'}--> 
    <div class="ui-tabpanel" role="tabpanel" data-bind="visible: tab.selected"> 
     <p data-bind="text: name"></p> 
    </div> 
    <!--/ko--> 

</div> 
+1

淘汰赛观测是可以用于功能获取/设置支持值。尝试'tab.selected()'而不是'tab.selected'。我使用[Knockout-ES5 shim](http://blog.stevensanderson.com/2013/05/20/knockout-es5-a-plugin-to-simplify-your-syntax/)来解决这个问题。 – CrimsonChris

+1

如果你想阅读一个observable,你应该像使用方法/函数一样使用'()'约定。 –

回答

0

click的结合呼叫所提供的功能,它通过将当前视图模型(也称为$data)。这就是为什么你看到[Object object]作为点击后观察值。既然你想点击切换观察点,你需要创建一个函数来做到这一点。一个漂亮,干净的方式做到这一点是通过自定义绑定,我会打电话给toggle

ko.bindingHandlers.toggle = { 
    init: function(element, valueAccessor) { 
     ko.utils.registerEventHandler(element, 'click', function() { 
      var obs = valueAccessor(); 
      obs(!obs()); 
     }); 
    } 
}; 

现在你绑定使用toggle代替click<li data-bind="toggle: tab.selected...