带电子的 angular1:ng-dblclick 不工作
angular1 with electron: ng-dblclick not working
我在 angular 1.6.4.
中使用 electron
我有一个控制器,我在其中动态生成 li
。我想在此列表项上绑定一个双击事件,但我无法成功。
function TheController($http, $scope, KeyService) {
$scope.openItem = function(id) {
console.log(id);
}
var key = KeyService.getLastKey();
connectToBackend($http,key);
}
function connectToBackend($http, key) {
$http.get(ENDPOINT).then(
function(result) {
//do some work
document.getElementById("list").innerHTML += `<li draggable="true" ondragstart="itemDrag(event)" id=${theID} ng-dblclick="openItem(this.id)"><i class="fa fa-folder-open"></i> ${result}</li><hr>`;
},
function(e) {
//error
}
);
}
如果我双击这里,绝对没有任何反应 - 甚至没有例外。
如果我使用 ondblclick
,如果我在 renderer.js
中定义 openItem
,它会起作用。但我宁愿在 TheController
中定义它,以保持一些顺序并能够访问注入的服务。
这可能吗?拖动的东西可能会干扰吗?
直接附加的 html 在编译之前不会起作用。在将其注入 DOM 树之前,您应该手动编译它。
document.getElementById("list")
.appendChild($compile(`
<li draggable="true" ondragstart="itemDrag(event)"
id=${theID} ng-dblclick="openItem(this.id)">
<i class="fa fa-folder-open"></i> ${result}
</li>
<hr>`)($scope);
通常直接从控制器进行 DOM 操作是反模式,因为它会使您的控制器代码与 view/html.
耦合得更紧密
我建议您使用 ng-inlcude
指令并将自定义模板放在 ng-template
脚本中。这样它就可以在 angular 的 $templateCache
内随时可用。
<script id="myCustom.html" type="text/ng-template">
<li draggable="true" ondragstart="itemDrag(event)"
id="{{theId}}" ng-dblclick="openItem(id)">
<i class="fa fa-folder-open"></i>
<div ng-include="ENDPOINT"></div>
</li>
</script>
然后您的 html 将如下所示。
Html
<div id="list">
... Your content ..
</div>
<div ng-include="'myCustom.html'"></div>
如果你注意到了,我直接在 ng-include
里面直接使用了 ENDPOINT
也是一样的,你必须做一些额外的设置
angular.module('myApp').config(function($sceDelegateProvider) {
$sceDelegateProvider.resourceUrlWhitelist([
// Allow loading from outer templates domain.
'http://somedomain.com/templates/**' //ENDPOINT domain should white listed here
]);
});
另外 ondragstart
不会调用您的控制器方法,直到您使用 angular 包装器指令对其进行修补。有可用的第三方库,您可以使用其中任何一个。
我在 angular 1.6.4.
中使用 electron我有一个控制器,我在其中动态生成 li
。我想在此列表项上绑定一个双击事件,但我无法成功。
function TheController($http, $scope, KeyService) {
$scope.openItem = function(id) {
console.log(id);
}
var key = KeyService.getLastKey();
connectToBackend($http,key);
}
function connectToBackend($http, key) {
$http.get(ENDPOINT).then(
function(result) {
//do some work
document.getElementById("list").innerHTML += `<li draggable="true" ondragstart="itemDrag(event)" id=${theID} ng-dblclick="openItem(this.id)"><i class="fa fa-folder-open"></i> ${result}</li><hr>`;
},
function(e) {
//error
}
);
}
如果我双击这里,绝对没有任何反应 - 甚至没有例外。
如果我使用 ondblclick
,如果我在 renderer.js
中定义 openItem
,它会起作用。但我宁愿在 TheController
中定义它,以保持一些顺序并能够访问注入的服务。
这可能吗?拖动的东西可能会干扰吗?
直接附加的 html 在编译之前不会起作用。在将其注入 DOM 树之前,您应该手动编译它。
document.getElementById("list")
.appendChild($compile(`
<li draggable="true" ondragstart="itemDrag(event)"
id=${theID} ng-dblclick="openItem(this.id)">
<i class="fa fa-folder-open"></i> ${result}
</li>
<hr>`)($scope);
通常直接从控制器进行 DOM 操作是反模式,因为它会使您的控制器代码与 view/html.
耦合得更紧密我建议您使用 ng-inlcude
指令并将自定义模板放在 ng-template
脚本中。这样它就可以在 angular 的 $templateCache
内随时可用。
<script id="myCustom.html" type="text/ng-template">
<li draggable="true" ondragstart="itemDrag(event)"
id="{{theId}}" ng-dblclick="openItem(id)">
<i class="fa fa-folder-open"></i>
<div ng-include="ENDPOINT"></div>
</li>
</script>
然后您的 html 将如下所示。
Html
<div id="list">
... Your content ..
</div>
<div ng-include="'myCustom.html'"></div>
如果你注意到了,我直接在 ng-include
里面直接使用了 ENDPOINT
也是一样的,你必须做一些额外的设置
angular.module('myApp').config(function($sceDelegateProvider) {
$sceDelegateProvider.resourceUrlWhitelist([
// Allow loading from outer templates domain.
'http://somedomain.com/templates/**' //ENDPOINT domain should white listed here
]);
});
另外 ondragstart
不会调用您的控制器方法,直到您使用 angular 包装器指令对其进行修补。有可用的第三方库,您可以使用其中任何一个。