backbone.js 到底什么是绑定?

blpfk2vs  于 2022-11-10  发布在  其他
关注(0)|答案(4)|浏览(259)

最近我越来越多地看到“绑定”和“实时绑定”这两个术语,特别是在Ember.js、Can.js、Knockout.js和Backbone.js等JavaScript框架中,更传统的是在可可和Objective-C中,我想知道绑定到底是什么?(以及“实时绑定”到底是什么?)
从广义上看,我们可以“将A绑定到B,”然后我们可以说,“A绑定到B,”这意味着B中的变化将自动反映到A中,用户不必担心必须设置观察器,但观察器会更早地自动设置,并在B发生变化时自动通知。
而当我们这样做的时候,我们就是在创造一个“绑定”。
从更严格的意义上讲,可可和Objective-C似乎是这样定义它的:绑定是对象A的一个***属性***foo,此属性观察并更改为对象B的属性bar的值。如何发生,我们不关心,它应该是隐藏的(就像一个黑盒子),而且通常它是由观察者模式实现的。所以“绑定”这个词实际上意味着一个“属性”,而不是一个动作--并且该属性观察并被更改为与另一个属性具有的值相同的值。
而且此绑定不限于绑定到数据的UI元素。它可以是包含较小UI元素片段的外部较大UI元素,并且外部UI元素具有绑定到内部UI元素属性的属性。或者它可以是绑定到另一个非UI数据属性的一个非UI数据属性。
这就是绑定吗?那活绑定呢?

kpbpu008

kpbpu0081#

我不清楚它的历史,但我猜测,在这个意义上,术语“绑定”源自术语“数据绑定”。“数据绑定”确实是一个操作:它是用实际数据中的值填充UI控件,也就是模型,例如,当表单中的字段用数据库中的数据填充并自动更新时,使用您提到的Observer模式。我认为绑定的主要区别是单向与双向:在双向数据绑定中,用户输入也同步回模型,而不是只将数据从模型同步到视图。
“绑定”是动词,而“数据绑定”的动词形式将是“绑定数据”或“执行数据绑定”。第二示例演示“数据绑定”也是名词,其可被定义为“将数据/模型属性绑定到UI/视图属性的动作”。关于“绑定”本身的名词版本,我想你是对的,它通常指的是两个属性之间的单独绑定。为了直观地演示这一点,假设点代表两个相互绑定的属性:


这里的“约束”是它们之间的界限。
更具体地说,单向绑定可以用一个箭头来表示:

  • ---〉
    双向绑定有两个箭头:
    ·<--->·
    “live binding”是一个术语,只是用来表示Observer模式正在被使用。我猜想,区分“live binding”的愿望可能来自于Web开发人员,他们以前使用的框架在页面第一次被加载时,每个HTTP请求只发生一次数据绑定。(部分归功于 AJAX ),没有理由不使用MVC最初定义中建议的Observer模式,所以对于RIA或本地桌面或移动的应用程序来说,“动态绑定”可能是一个不必要的术语。
    顺便说一句,Trygve Reenskaug对MVC的最初设想(他发明的)基本上是关于在系统中反映最终用户的心理模型,这样“模型”几乎是用户直接操作的东西(或者至少对用户来说是这样的)。(或者至少有某种机制可以在不重新加载页面的情况下保持Model和View的同步)对它来说是必不可少的,而在服务器端拥有大部分代码的Web开发框架是“它并不是真正意义上的MVC,而是一种在代码组织方面遵循相同基本思想的变体。主要用于客户端应用程序的现代Javascript框架使真正的MVC在Web开发中成为可能。
    回到您在问题中提出的观点,我认为您说绑定不一定只是模型属性和视图属性之间的绑定,这也是正确的;它可能介于两个模型属性之间(通常在不同的模型上),或者在两个视图属性之间。但是我不同意你的Assert,即“绑定”只是一个与编程相关的名词--很明显,在英语中它是动词“绑定”的名词形式,换句话说,“绑定的行为”,我认为这在编程中也是一个有效的用法。所以本质上我所说的是它有双重含义,但我认为你提出的定义是最常见的。下面是我对正式定义的尝试:

绑定。

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

j2datikz

j2datikz2#

绑定在一个非常简单的意义上意味着链接,假设你有一个进度条和一个变量X,每次你点击一个按钮X的值增加。使用绑定你可以得到X的值(每次递增)并显示在进度条上。在下面的C#代码行中,“pb”是进度条,TapCount是保存总点击次数的变量。它显示“pb”的值已绑定到变量TapCount

public void tapping
{    
 pb.Value = TapCount; 
}
h79rfbju

h79rfbju3#

它与vanilla javascript中.bind方法的原始用法没有什么不同:将对象的作用域绑定到方法。
考虑this.iterable.map( this.flush )this.iterable.map( this.flush.bind(this)),在第一个例子中,我们简单地在this上的可迭代属性的每个迭代上运行一个方法--但是为了让this.flush方法访问this属性,你必须把它绑定到this
同样的,在Ember这样的框架中,模型是一个声明。为了从远程源填充模型,你需要一个示例。为了从手柄修改模型,你需要一个示例。如果你的UI改变立即影响模型示例--它们是绑定的。
伪编码:x1月5日至1x日x1月6日至1x
根据我的经验,“Live-Binding”是在UI发生变化时立即将数据绑定到远程源。
伪编码:UI.view.bind(modelInstance)RemoteSource.bind(modelInstance)modelInstance.onChange(RemoteSource.update.bind(modelInstance))

7xllpg7q

7xllpg7q4#

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

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

现在,您希望在不断向温度提供程序API发出 AJAX 请求的同时,随着温度的变化更新该值。在该响应中,您将收到一个温度值,该值将相应地更新您的UI。
这种用Javascript变量或类似变量更新HTML的需要产生了绑定的概念。
当你创建一些东西来保持你的DOM与任何JS变量中的变化同步时,可以说DOM -变量对是相互绑定的。
还有一个术语叫做双向绑定,其中DOM中的任何更改都会更新绑定的JS变量,反之亦然。

相关问题