Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何删除jQuery";html";是否在Require.JS上下文中运行?_Jquery_Backbone.js_Requirejs - Fatal编程技术网

如何删除jQuery";html";是否在Require.JS上下文中运行?

如何删除jQuery";html";是否在Require.JS上下文中运行?,jquery,backbone.js,requirejs,Jquery,Backbone.js,Requirejs,我正试图找出一些方法来迫使开发人员使用下划线模板,而不是使用html(html)我们使用jQuery、Backbone、Require.js和下划线,我们的许多呈现代码最终都会这样做(为了可读性而简化): define(['jquery','下划线','backbone'], 函数($,389;,主干){ var-template=u2;.template(“”); $('.some div').html(模板({title:model.get('name'))}); } ); 大约有10%的

我正试图找出一些方法来迫使开发人员使用下划线模板,而不是使用
html(html)
我们使用jQuery、Backbone、Require.js和下划线,我们的许多呈现代码最终都会这样做(为了可读性而简化):

define(['jquery','下划线','backbone'],
函数($,389;,主干){
var-template=u2;.template(“”);
$('.some div').html(模板({title:model.get('name'))});
}
);
大约有10%的时间,我在我们的代码库中发现这样的代码,这是我想要避免的。我想要强制使用模板:

  define(['jquery','underscore','backbone'], 
      function($,_,Backbone){
        $('.some-div').html("<strong>"+ model.get('name') +"</strong>");
      }
  );
define(['jquery','下划线','backbone'],
函数($,389;,主干){
$('.some div').html(“”+model.get('name')+“”);
}
);
在此上下文中,我想删除jQuery
html
函数,以迫使开发人员使用我们团队定义的另一种方法(“renderTemplate”),该方法要求使用模板

如何做到这一点?

注意:我知道我们可以通过代码审查和最佳实践来做到这一点,但我更愿意迫使开发人员更快地走这条路,因为
html
函数不存在,他们会问为什么

编辑:我知道我可以从jQuery原型中删除
html
函数,但它需要存在于我们在RequireJS模块上下文之外的其他库中。它只需要在上面定义的模块上下文中删除。

这里有一种方法,只使用映射。这是从关于如何使用
noConflict
调用加载jQuery改编而来的

您需要一个执行删除操作的
jquery private
模块:

define(["jquery"], function ($) {
  $.noConflict();
  delete $.fn.html;
  return $;
});
以及以下配置:

  require.config({
    baseUrl: "./js",
    paths: {
       jquery: 'jquery-1.10.2'
    },
    map: {
      '*': { 'jquery': 'jquery' },
      'restricted': {'jquery': 'jquery-private'}
    }
  });
在上面的代码中,只有名为
restricted
的模块不能使用
html
方法。在实际项目中,您可能希望使用算法列出所有必须限制的模块。它们都必须使用与上面
restricted
相同的映射

基本原则是jQuery加载两次。像
restricted
load
jQuery private
这样的模块在请求
jQuery
时都会加载,并得到修改后的版本。其他所有模块都会得到未修改的版本

请注意,
map
选项带有一个严重的错误:它不适用于相关模块名称

上下文 下面是另一种方法,使用上下文。下面是一个配置和主代码,说明了它是如何工作的:

  require.config({
    baseUrl: "./js",
    paths: {
       jquery: 'jquery-1.10.2'
    }
  });

  require(["jquery"], function ($) {
     console.log($("body").html);
  });

  var rr = require.config({
    context: "restricted",
    baseUrl: "./js",
    paths: {
       jquery: 'jquery-1.10.2'
    },
    map: {
      '*': { 'jquery': 'jquery-private' },
      'jquery-private': { 'jquery': 'jquery' }
    }
  });

  rr(["jquery"], function ($) {
     console.log($("body").html);
  });

这里jQuery也加载了两次。它在默认上下文中加载了一次并保持不变。第一次加载也是在全局空间中设置
$
jQuery
的加载。它在
受限的
上下文中第二次加载,并且在那里删除
html
方法。所有受限代码都必须是l在
受限的
上下文中加载。必须具有
html
访问权限的代码必须使用默认上下文加载。

您编写的
$('.some div').html(…)
在您的第一个示例中。这是一个输入错误吗?您可以是邪恶的,并将其从jQuery对象原型中删除。或者您可以更邪恶,并在导入的
jQuery.js
中编辑函数定义……您意识到如果
html
不再可用,您的第一个示例将无法工作,因为它还依赖于
htmle> ?是的,就是这样。它不能从jQuery原型中删除,因为主干网在某些情况下可能需要它来查看内容。因此,它只能在这个匿名函数Require.JS上下文中删除。我将进一步澄清我的问题。@DavidSulc:好的观点。我们可能会将“html”函数重命名为其他函数,供用户使用“渲染模板"方法。我对RequireJS非常陌生,希望这是可能的……谢谢你的回答!对于像我这样的新手来说,如果你想切换它,那么默认上下文就是jQuery受限的上下文,只需按照你的想法交换它们,然后将
上下文:受限
行移到默认的
require.config
block.and
  require.config({
    baseUrl: "./js",
    paths: {
       jquery: 'jquery-1.10.2'
    }
  });

  require(["jquery"], function ($) {
     console.log($("body").html);
  });

  var rr = require.config({
    context: "restricted",
    baseUrl: "./js",
    paths: {
       jquery: 'jquery-1.10.2'
    },
    map: {
      '*': { 'jquery': 'jquery-private' },
      'jquery-private': { 'jquery': 'jquery' }
    }
  });

  rr(["jquery"], function ($) {
     console.log($("body").html);
  });