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 = 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: simulatedResults 17 }); 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等。