首页 > 代码库 > KnockoutJs学习笔记(八)

KnockoutJs学习笔记(八)

with binding用于创建一个新的绑定环境(binding context),包含with binding的元素的所有子元素都将处于指定的object的环境限定内。

下面是一个简单的使用with binding的例子:

js部分:

1 var viewModel = {2     key: "Name",3     person: {4         firstName: "Kazusa",5         lastName: "Touma"6     }7 };8 9 ko.applyBindings(viewModel);

html部分:

1 <h3 data-bind="text: key"></h3>2 <p data-bind="with: person">3     First name: <span data-bind="text: firstName"></span><br />4     Last name: <span data-bind="text: lastName"></span>5 </p>

页面显示效果如下:

在上例中,注意到,p元素的子元素内的data-bind都是直接绑定firstName和lastName而无需在前面添加person的前缀,这正是因为我们在p中已经利用with binding将binding context改成了person。

下面是一个更为复杂的例子:

html部分:

 1 <form data-bind="submit: getTweets"> 2     Twitter account: 3     <input data-bind="value: twitterName" /> 4     <button type="submit">Get tweets</button> 5 </form> 6  7 <div data-bind="with: resultData"> 8     <h3>Recent tweets fetched at <span data-bind="text: retrievalDate"></span></h3> 9     <ol data-bind="foreach: topTweets">10         <li data-bind="text: text"></li>11     </ol>12 13     <button data-bind="click: $parent.clearResults">Clear tweets</button>14 </div>

js部分:

 1 function MyViewModel() { 2     var self = this; 3     self.twitterName = ko.observable("@Kazusa"); 4     self.resultData =http://www.mamicode.com/ ko.observable(); 5  6     self.getTweets = function() { 7         var name = self.twitterName(); 8         var simulatedResults = [ 9             { text: name + ": What a nice day." },10             { text: name + ": Building some cool apps." },11             { text: name + ": Just saw a famous celebrity eating lard. Yum." }12         ];13         14         self.resultData({15             retrievalDate: new Date(),16             topTweets: simulatedResults17         });18     };19 20     self.clearResults =  function() {21         self.resultData(undefined);22     }23 }24 25 ko.applyBindings(new MyViewModel());

从这里例子中,我们可以看出with binding在使用时的几个特点。当with binding所绑定的binding context为null或是undefined时,包含with binding的元素的所有子元素都将从UI页面中移除。如果我们需要从parent binding context中获取data或是function,我们可以使用特殊的context properties比如说$parent或root,这部分可以参考The binding context。

倘若绑定的binding context是一个observable,包含with binding的元素会随着observable的变化而移除现有的子孙元素并添加一系列隶属于新的binding context的子孙元素。

类似的,with binding也提供无容器的控制流语法,这里省略例子,可以参考if binding等。

KnockoutJs学习笔记(八)