具体到底是什么?

时间:2013-05-31 20:28:37

标签: data-binding backbone.js binding ember.js cocoa-bindings

我最近越来越多地看到术语“绑定”和“活动绑定”,特别是在像Ember.js,Can.js,Knockout.js和Backbone.js这样的JavaScript框架中,更传统的是, Cocoa和Objective-C,想知道什么是绑定? (究竟什么是“活动绑定”?)。

似乎从宽松的意义上说,我们可以“绑定A到B”,然后我们可以说,“A绑定到B”,这意味着B中的变化将自动反映在A中 - 没有用户担心必须设置观察者,但观察者会自动设置,并在B更改时自动通知。

当我们这样做时,我们正在创造一个“绑定”。

从更严格的意义上说,Cocoa和Objective-C似乎是这样定义的:绑定是对象A的 属性 foo,并且此属性观察并更改为对象B的属性bar的值。如何发生,我们不关心并且它应该被隐藏(如黑盒子),并且通常由观察者模式。所以“绑定”这个词实际上意味着一个“属性”,而不是一个动作 - 这个属性观察并变为与其他属性相同的值。

此绑定不仅限于绑定到数据的UI元素。它可以是包含较小UI元素的外部较大UI元素,外部UI元素具有绑定到内部UI元素属性的属性。或者它可以是绑定到另一个非UI数据属性的一个非UI数据属性。

这是一个绑定是什么?那么活动绑定呢?

4 个答案:

答案 0 :(得分:0)

我不确定历史,但我的猜测是,在这种意义上,“绑定”一词源自“数据绑定”一词。 “数据绑定”确实是一个动作:它使用来自实际数据,AKA模型的值填充UI控件,例如,当表单中的字段填充数据库中的数据并使用您提到的Observer模式自动更新时。我认为绑定的主要区别是单向和双向:在双向数据绑定中,用户输入也会同步回模型,而不是仅从模型同步到视图的数据。

“bind”是一个动词,“数据绑定”的动词形式是“绑定数据”或“执行数据绑定”。第二个示例演示“数据绑定”也是名词,可以定义为“将数据/模型属性绑定到UI /视图属性的行为”。关于名词版本的“绑定”本身,我认为你是正确的,它通常是指两个属性之间的个别绑定。为了在视觉上证明这一点,假设点代表两个彼此绑定的属性:

•-----•

这里的“绑定”是它们之间的界限。

为了更具体,单向绑定可以用一个箭头表示:

•----> •

带有两个箭头的双向绑定:

•< ---> •

“实时绑定”是一个术语,仅用于表示正在使用Observer模式。我的猜测是,区分“实时绑定”的愿望可能来自之前使用过框架的Web开发人员,当框架首次加载时,每个HTTP请求只发生一次数据绑定。现在,Javascript繁重的Web应用程序正在成为常态(部分归功于ajax),没有理由不使用MVC的原始定义所建议的Observer模式,因此“实时绑定”可能是关于RIA的不必要的术语或原生桌面或移动应用程序。

另外,Trygve Reenskaug对MVC的最初设想(他发明了它)从根本上讲是反映最终用户在系统中的心理模型,以便“模型”是用户几乎直接操作的东西(或者至少是感觉到的)那种方式给用户)。所以Observer模式(或至少一些保持模型和视图同步而不重新加载页面的机制)对它来说是必不可少的,而且在服务器端拥有大部分代码的Web开发框架并不是最初构想的MVC。而是一种在代码组织方面遵循相同的一般概念的变体。主要用于客户端应用程序的现代Javascript框架使得真正的MVC成为Web开发的可能。

回到你在问题中提出的一点,当你说绑定不一定只是模型属性和视图属性之间时,我认为你也是正确的。它可以在两个模型属性之间(通常在不同的模型上),也可以在两个视图属性之间。但是我不同意你的断言“绑定”只是一个关于编程的名词 - 显然在英语中它是动词“bind”的名词形式,换句话说就是“绑定行为”,我认为这是有效的在编程中的用法。基本上我所说的是它具有双重含义,但我认为你提出的定义是最常见的。这是我对正式定义的尝试:

<强>装订。

  1. 两个属性(通常在两个不同的对象中)之间的连接,它使属性保持彼此同步,即具有相同的值。同步可以是单向的,也可以是双向的。
  2. 发起这种联系的行为。

答案 1 :(得分:0)

绑定在一个非常简单的意义上意味着链接,假设你有一个进度条和一个变量X,每次点击一个按钮时,X的值增量。使用Binding,您可以获取X的值(每次递增)并在进度条上显示。在C#&#34; pb&#34;中的以下代码行中是进度条,TapCount是保存总抽头的变量。它显示了&#34; pb&#34;的价值。已绑定到变量TapCount

public void tapping
{    
 pb.Value = TapCount; 
}

答案 2 :(得分:0)

它与vanilla javascript中.bind方法的原始用法没有什么不同:您将对象的范围绑定到方法。

考虑this.iterable.map( this.flush )this.iterable.map( this.flush.bind(this))。在第一个中,我们在迭代属性的每个交互上简单地运行一个方法 - 但是为了使this.flush方法访问this属性,必须将它绑定到{{1 }}

以同样的方式,在像Ember这样的框架中,模型是一个声明。要从远程源填充该模型,您需要一个实例。要从把手修改模型,您需要一个实例。如果您的UI更改会立即影响模型实例 - 它们就会被绑定。

伪编码: this UI.view.bind(modelInstance)

根据我的经验,“Live-Binding”是在UI中更改时立即将数据绑定到远程源。

伪编码: RemoteSource.bind(modelInstance) UI.view.bind(modelInstance) RemoteSource.bind(modelInstance)

答案 3 :(得分:0)

“绑定”一词主要用于客户端开发。例如,您创建了一个显示温度的html网页。

<div id="temp_value"> 77 °F </div>

现在,当您不断向温度提供者API发出AJAX请求时,您想随着温度的变化更新此值。在该响应中,您将收到一个温度值,该值将相应地更新您的用户界面。

这种使用Javascript变量或类似变量更新HTML的需求引起了绑定的概念。

当您创建使DOM与任何DOM的JS变量中的更改保持同步时-变量对可以说是彼此绑定的。

还有一个称为双向绑定的术语,其中DOM中的任何更改都会更新绑定的JS变量,反之亦然。