系统学习magento二次开发,推荐小册:《Magento中文全栈二次开发 》
本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。
你好模型, 视图, 查看模型
了解KnockoutJS的最快方法是一个基本的例子。首先,让我们创建以下 HTML 页面
<!-- File: page.html --> <!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script> <script src="https://code.jquery.com/jquery-3.0.0.min.js" integrity="sha256-JmvOoLtYsmqlsWxa7mDSLMwa6dZ9rrIdtrrVYRnDRH0=" crossorigin="anonymous"></script> </head> <body> <div id="main"> <h1></h1> <p></p> </div> </body> </html>
从 cloudflare CDN 加载 KnockoutJS 库
从 jQuery 代码 CDN 加载 jQuery 库
设置一个空的 DOM 节点结构
您不需要从 CDN 加载 jQuery 和 KnockoutJS,但如果您这样做,则在本教程中它是最简单的。
如果在浏览器中加载此页面,它将完全空白。那是因为我们需要
添加创建视图模型并应用 KnockoutJS 绑定的 JavaScript 代码
将视图代码添加到从视图模型读取的 HTML 页面
解决其中的第一个问题,让我们将第三个javascript文件添加到我们的页面。我们将创建一个以以下内容命名的文件ko-init.js
//File: ko-init.js
jQuery(function(){
viewModel = {
title:"Hello World",
content:"So many years of hello world"
};
ko.applyBindings(viewModel);
});然后使用第三个脚本标签添加到我们的页面。ko-init.js
<!-- File: page.html --> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script> <script src="https://code.jquery.com/jquery-3.0.0.min.js" integrity="sha256-JmvOoLtYsmqlsWxa7mDSLMwa6dZ9rrIdtrrVYRnDRH0=" crossorigin="anonymous"></script> <script type="text/javascript" src="ko-init.js"></script> 最后,更改 and 标记,使其包含以下属性。h1pdata-bind <!-- File: page.html --> <div id="main"> <h1 data-bind="text:title"></h1> <p data-bind="text:content"></p> </div>
完成上述操作后,重新加载页面,您应该会看到标题和内容已呈现。
//File: ko-init.js
jQuery(function(){
viewModel = {
title:"Hello World",
content:"So many years of hello world"
};
ko.applyBindings(viewModel);
});
//File: ko-init.js
viewModel = {
title:"Hello World",
content:"So many years of hello world"
};
<!-- File: page.html -->
<div id="main">
<h1 data-bind="text:title"></h1>
<p data-bind="text:content"></p>
</div>
value = viewModel['title'];
textNode = document.createTextNode(value);
h1.appendChild(textNode);//File: ko-init.js
jQuery(function(){
var viewModelConstructor = function()
{
this.getTitle = function()
{
return "Hello Method World";
}
this.content = "So many years of hello world";
}
viewModel = new viewModelConstructor;
ko.applyBindings(viewModel);
});在这里,我们使用了一个javascript构造函数来创建一个简单的对象,并带有一个方法。如果我们更改视图以调用该方法,您将看到它按预期工作getTitlegetTitle
<!-- File: page.html --> <div id="main"> <h1 data-bind="text:getTitle()"></h1> <p data-bind="text:content"></p> </div>
考虑绑定参数的另一种方法是,它们是访问视图模型的值和方法的临时、有限的 JavaScript 范围。
### 其他绑定
虽然此示例很简单,但您可以开始了解这个基本构建块如何实现更复杂的视图逻辑。更新 DOM 的业务留给了 ings,更新模型的业务留给了纯非 DOM JavaScript 代码。data-bind
你可以开始看到它与其他绑定的价值。例如,让我们在我们的theValueviewModelConstructor
//File: ko-init.js
jQuery(function(){
var viewModelConstructor = function()
{
this.getTitle = function()
{
return "Hello World";
}
this.content = "So many years of hello world";
this.theValue = "2";
}
viewModel = new viewModelConstructor;
ko.applyBindings(viewModel);
});,然后添加具有新绑定的输入标记。
<!-- File: page.html --> <div id="main"> <h1 data-bind="text:getTitle()"></h1> <p data-bind="text:content"></p> <input type="text" data-bind="value:theValue"/> </div>
重新加载页面,您将看到值为 .2
data-bind="value:theValue" <!-- File: page.html --> <div id="main"> <h1 data-bind="text:getTitle()"></h1> <p data-bind="text:content"></p> <select data-bind="value:theValue"> <option value="">-- Choose --</option> <option value="1">First</option> <option value="2">Second</option> <option value="3">Third</option> </select> </div>
虽然这个例子很简单,但它背后的概念却不是。无需更改任何 javascript 应用程序代码,绑定允许我们更改 UI。value
### 可观察量
到目前为止,我们看到的是一个强大的客厅技巧。整洁,也许有用,但它只为KnockoutJS真正的“淘汰”功能——可观察量奠定了基础。
同样,我们将通过一个例子进行深入研究。更改视图,使其与以下内容匹配
<!-- File: page.html --> <div id="main"> <p data-bind="text:theValue"></p> <select data-bind="value:theValue"> <option value="">-- Choose --</option> <option value="1">First</option> <option value="2">Second</option> <option value="3">Third</option> </select> <input type="text" data-bind="value:theValue"/> <div> <br/><br/> <button id="button">Do It</button> </div> </div>
并更改视图模型和绑定,使其与以下内容匹配。
//File: ko-init.js
jQuery(function(){
var viewModelConstructor = function()
{
this.theValue = ko.observable("1");
}
window.viewModel = new viewModelConstructor;
ko.applyBindings(window.viewModel);
});如果您重新加载页面,您将看到我们已将 的值绑定到 our and 标记。到目前为止,我们的观点没有什么新东西——这与我们以前所做的那种绑定相同。但是,您会注意到我们在视图模型中做了一些不同的事情。1<input/><p/>
//File: ko-init.js
this.theValue = ko.observable("1");我们没有设置为硬编码值或自定义函数,而是将值设置为 KnockoutJS 称之为可观察量的值。可观察量是一种特殊的吸气者和二传手。theValue
如果你打开你的javascript控制台,并键入以下内容,你会看到我们可以通过将其作为函数调用来获取可观察量的值(可以通过控制台获得,因为我们将其定义为对象的全局对象)
viewModelwindow > viewModel.theValue() > "1"
我们可以通过传入参数在可观察量上设置一个值。下面介绍了如何设置可观察量,然后获取可观察量的值。
> viewModel.theValue("3")
//...
> viewModel.theValue()
> "3"然而,可观察量的真正力量在于我们将可观察量绑定到的 DOM 节点会发生什么。尝试通过控制台更改观察器的值并观察浏览器窗口
> viewModel.theValue("3");
> viewModel.theValue("2");
> viewModel.theValue("1");
> viewModel.theValue("10");更新可观察量的值时,绑定节点的值会实时更改。同样,作为开发人员,我们不必担心 DOM 节点如何更新——一旦我们在模型上设置了值,这个值就会自动反映在用户界面中。
虽然它超出了本文的范围,但当我们的视图模型包含方法时,您可以看到它如何组合在一起形成复杂的 JavaScript 应用程序。
//File: ko-init.js
jQuery(function(){
var viewModelConstructor = function()
{
this.theValue = ko.observable("1");
var that = this;
this.pickRandomValue = function(){
var val = Math.floor(Math.random() * (3));
that.theValue(val);
};
}
window.viewModel = new viewModelConstructor;
ko.applyBindings(window.viewModel);
});并且您使用 KnockoutJS 的事件绑定,例如click
<!-- File: page.html --> <button data-bind="click:pickRandomValue">Do It</button>
我们将把解析作为读者的练习
### 模板绑定
另一个需要理解的重要绑定是 KnockoutJS 的模板绑定。考虑这样的视图模型
//File: ko-init.js
jQuery(function(){
var viewModelConstructor = function()
{
this.first = {
theTitle:ko.observable("Hello World"),
theContent:ko.observable("Back to Hello World")
};
this.second = {
theTitle:ko.observable("Goodbye World"),
theContent:ko.observable("We're sailing west now")
};
}
viewModel = new viewModelConstructor;
ko.applyBindings(viewModel);
});在这里,我们创建了一个标准视图模型,但具有嵌套的数据对象。如果将其与这样的视图相结合
<!-- File: page.html -->
<div id="main">
<div id="one" data-bind="template:{'name':'hello-world','data':first}"></div>
<div id="two" data-bind="template:{'name':'hello-world','data':second}">
</div>
<script type="text/html" id="hello-world">
<h1 data-bind="text:theTitle"></h1>
<p data-bind="text:theContent"></p>
</script>
</div>模板绑定接受 javascript 对象作为参数
<!-- File: page.html -->
<div id="one" data-bind="template:{'name':'hello-world','data':first}"></div>data 参数是我们想要用来渲染模板的视图模型的属性。模板的名称就是这样 — 要查找和呈现的模板名称。
向系统添加命名模板的最基本方法是添加带有 of 的标记。<script/>typetext/html
<!-- File: page.html --> <script type="text/html" id="hello-world"> <h1 data-bind="text:theTitle"></h1> <p data-bind="text:theContent"></p> </script>
如果你以前从未见过这个,它可能看起来很奇怪/陌生,但许多现代JavaScript框架使用非标签作为将非渲染(但DOM可访问)内容添加到页面的一种方式。模板只是一组带有 KnockoutJS 绑定的标准 HTML 节点。text/javascript<script/>
### 组件
我们将要进行的最后一个绑定是组件绑定。组件是一种将 KnockoutJS 模板和 KnockoutJS 视图文件打包在一起的方法。这意味着您可以有一个相对简单的视图
<!-- File: page.html --> <div data-bind="component:'component-hello-world'"></div>
这隐藏了已注册组件的复杂性。
//File: ko-init.js
jQuery(function(){
var viewModelConstructor = function()
{
this.message = "Hello World";
}
var theTemplate = "<h1 data-bind=\"text:message\"></h1>";
ko.components.register('component-hello-world', {
viewModel:viewModelConstructor,
template:theTemplate
});
ko.applyBindings();
});组件对象的函数需要组件的名称,然后是 KnockoutJS 组件对象。组件对象是具有两个属性的 JavaScript 脚本对象。该属性需要一个视图模型构造函数,并且该属性应该是带有 KnockoutJS 模板的字符串。注册后,可以通过将组件的名称(作为字符串)传递到绑定中使用组件。registerviewModeltemplate
<!-- File: page.html --> <div data-bind="component:'component-hello-world'"></div>
如果您不想使用语法 — KnockoutJS 使您能够根据组件名称插入具有自定义标记名称的组件。在您的视图/HTML 文件中尝试此操作data-bind
<!-- File: page.html --> <component-hello-world></component-hello-world>
这只触及了KnockoutJS可能的表面。官方文档对组件绑定有一个很好的概述。
### 自定义绑定
我们今天要讨论的最后一个 KnockoutJS 功能是自定义绑定功能。KnockoutJS使javascript开发人员能够创建自己的绑定。例如,这里我们调用一个名为 的自定义绑定,并向其传递 viewModel 的属性值。pulseStormHelloWorldmessage
<!-- File: page.html --> <div data-bind="pulseStormHelloWorld:message"></div>
如果没有实现,KnockoutJS将忽略我们的绑定。相反,请尝试以下ko-init.js
//File: ko-init.js
jQuery(function(){
var viewModelConstructor = function()
{
this.message = "Hello World";
}
ko.bindingHandlers.pulseStormHelloWorld = {
update: function(element, valueAccessor){
jQuery(element).html('<h1>' + valueAccessor() + '</h1>');
}
};
ko.applyBindings(new viewModelConstructor);
});要将自定义绑定添加到 KnockoutJS,我们需要做的就是向对象的对象添加一个属性。此属性的名称是我们绑定的名称。处理程序是带有方法的 JS 对象。每当调用绑定时,KnockoutJS 都会调用该方法 — 无论是在 期间还是通过可观察量。kobinidngHandlersupdateupdateapplyBindings
完成上述操作后,重新加载 HTML 页面,您将看到调用的自定义绑定。当然,这是一个微不足道的例子,但是使用自定义绑定,您可以让KnockoutJS做任何您的编程思维想到的事情。